工具/软件:TI C/C++编译器
在字符串和浮点值之间转换时、使用带有%f 格式的 strtof 和 snprintf 时、我们会看到一些意外行为。 我们将针对 CM 上的 ARM 使用 ti-cgt-C2000_20.2.TLS 库。
STRT:
如果输入字符串15.000、则转换正常、但如果输入15.0000000000000000、则得到15.000005。 当单步执行第170行的例程时,Result*base 会变大,并且向该值中添加0实际上会增加非零量。 N + 0不再等于 N? 我想当底座为1e9或1e10时、它就在附近。 15.000000000000000000000000只有两个有效位、可以在浮点中轻松表示、没有错误、但 strtof 不会在没有为大量零添加错误的情况下进行转换。
作为一种解决方案、我们使用 strtod 将问题进一步移出可能不会成为问题的地方。 strtod 不会错误地正确转换15.00000000。
snprintf:
snprintf (valueStr、23、"%.6F"、msg->val.valueef);
当输入的浮点值为123456790519087104 (0x5bdb4da6)时,打印的字符串为 123456790519087076.187。 这是意料之外的。 我们尝试使用%.6lf 并将浮点数转换为双精度型、但这没有解决 strtod 情况中的问题。
是否有任何关于可能导致这种情况的想法? 必须正确显示输入的数字、或者至少可以正确显示哪些数字、以及在这种情况下不显示这些数字的原因。
谢谢、
Jennifer