Ham*_*han 2 c math floating-point
我想知道编译器显示float值不准确的机制.例
float a = 0.056;
printf("value = %f",a); // this prints "value = 0.056"
Run Code Online (Sandbox Code Playgroud)
如果您尝试以二进制浮点格式存储0.056,则可以获得此值(使用此链接进行转换)
0.00001110010101100000010000011000,等于0.0559999998658895
1.编译器如何显示0.056而应显示0.055999999?
让我们再举几个例子吧
#include <stdio.h>
main()
{
float a, b;
a = 0.056;
b = 0.064; // difference is 0.08
printf("a=%f, b=%f",a,b);
if( b - a == 0.08) // this fails
printf("\n %f - %f == %f subtraction is correct",b,a,b-a);
else
printf("\n%f - %f != %f Subtraction has round-off error\n",b,a,b-a);
}
Run Code Online (Sandbox Code Playgroud)
请注意,else块在此处执行,而我们期望块是正确的.这是输出.
a=0.056000, b=0.064000
0.064000 - 0.056000 != 0.008000 Subtraction has round-off error
Run Code Online (Sandbox Code Playgroud)
同样,值以我们期望的方式显示(没有舍入错误),但这些值确实具有舍入错误,但显示了错误的伪装值.我的第二个问题是
2.有没有办法显示存储号码的实际价值而不是我们输入的伪装号码?
注意:我在Visual Studio 2008中包含C代码,但它应该可以在任何语言中重现.
ken*_*ytm 11
编译器没有显示任何内容?您的程序显示0.056,因为%f只显示最多6位数的结果.%.16f如果您想查看所有不准确之处,请尝试(结果:http://ideone.com/orrkk).
printf的联机帮助页显示了可以与这些说明符一起使用的许多其他选项.