这是在测试期间出现的,我必须比较实际输出和预期输出之间的值。
代码:
float nf = 584227.4649743827f;
printf("Output: \t %.9f \n", nf);
输出:
Output: 584227.437500
我在C语言方面的知识显然很薄弱,因此有人可以向我解释这种情况:
0.027474382659420f
)?nf
中?0.027474382659420f
偏差的信息。与这种测试中的问题有关的任何其他建议也将得到广泛应用。
答案 0 :(得分:4)
为什么印刷品中存在这种偏差(0.027474382659420f)?
因为float
的准确度约为7位,并且您的偏差从第七位开始。
这仅是打印的限制,还是浮点数据类型 限制?
这是浮点数的限制,因此也包含double
(尽管double
的精度更高)。它也与二进制数和十进制数之间的转换有关,例如,0.2
是二进制表示形式的重复十进制(很好,二进制),因此也有可能四舍五入错误,并且实际上可能会变成类似于0.200000000000000011
。
哪个值实际存储在变量nf中?
您看到的那个打印了。您指定的584227.4649743827f
最有可能甚至不存在于已编译程序的二进制文件中,并且在编译期间会“转换”为实际使用的值。
我应该如何使用这样的值,以免丢失信息 例如在分配过程中的偏差为0.027474382659420f。
使用double
,其精度约为15-17位数字。另外,您需要从f
中删除584227.4649743827f
,将其变成一个double
常量。如果不够准确,则可能必须使用外部库代替任意精度数字,例如GMP。
您的浮点数很可能符合IEEE 754标准,但不能保证。