编译器如何显示浮点数的*不准确*值?

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联机帮助页显示了可以与这些说明符一起使用的许多其他选项.

  • 并且`printf`正在舍入值,而不是截断. (5认同)
  • @Thecrocodilehunter:对不起,我错过了一个`.`.`%16f`将宽度设置为16,`%.16f`将精度设置为16.请参阅更新. (2认同)