VC+上的浮点乘法+;2008年快车
为什么要使用下面的代码段VC+上的浮点乘法+;2008年快车,c,visual-studio-2008,C,Visual Studio 2008,为什么要使用下面的代码段 int i = 30; int p = 0.7f * i; printf("p is %d\n", p); 在vc++2008 express上给出20而不是21? 我知道这是个老编译器 数字0.7不能用编译器用于float的基于二进制的浮点格式表示。当十进制数字“0.7”转换为浮点时,结果是最接近的可表示值。这个数字略低于0.7 将其与30相乘产生一个略低于21的数字,将其转换为int并进行截断产生20。值0.7不能在浮点变量中精确表示。请查看并注意,20.9999
int i = 30;
int p = 0.7f * i;
printf("p is %d\n", p);
在vc++2008 express上给出20而不是21?
我知道这是个老编译器 数字0.7不能用编译器用于
float
的基于二进制的浮点格式表示。当十进制数字“0.7”转换为浮点时,结果是最接近的可表示值。这个数字略低于0.7
将其与30相乘产生一个略低于21的数字,将其转换为
int
并进行截断产生20。值0.7
不能在浮点变量中精确表示。请查看并注意,20.999999
将被截断为20
。感谢您提供的链接,但我更好奇的是,Microsoft在VC++2019中应该做哪些更改,因为它给出了正确的数学结果。您是指使用精确的代码,还是当您使用printf
浮点值时?也许2008年的浮点实现略有不同。好主意!但是我不打印floatint点值,它已经被转换为int。我想我可以通过查看两个编译器生成的汇编程序来回答自己的问题。也许旧的PC使用的是80x87 FPU。关键是,你不应该依赖于浮点运算的精度。