gur*_*hni 7 c c++ floating-point floating-accuracy
可能重复:
与float文件相比较的奇怪输出
当我尝试比较2个相同的float值时,它不会在以下代码中打印"相等的值":
void main()
{
float a = 0.7;
clrscr();
if (a < 0.7)
printf("value : %f",a);
else if (a == 0.7)
printf("equal values");
else
printf("hello");
getch();
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
pax*_*blo 28
虽然很多人会告诉你总是将浮点数与epsilon进行比较(这通常是一个好主意,虽然它应该是被比较的值的百分比而不是固定值),但实际上这并不是必需的,因为你是使用常量.
你的具体问题是:
float a = 0.7;
Run Code Online (Sandbox Code Playgroud)
使用double常量0.7来创建单个精度数字(失去一些精度),同时:
if (a == 0.7)
Run Code Online (Sandbox Code Playgroud)
将比较两个双精度数字(a首先提升).
当将双倍0.7进入浮球时,丢失的精度a在a恢复到双倍时不会重新获得.
如果你将所有这些0.7值更改为0.7f(强制浮动而不是加倍),或者如果你只做a一个双精度,那么它将正常工作 - 我float现在很少使用它,除非我有大量的数组并且需要节省空间.
您可以通过以下方式查看此操作:
#include <stdio.h>
int main (void){
float f = 0.7; // double converted to float
double d1 = 0.7; // double kept as double
double d2 = f; // float converted back to double
printf ("double: %.30f\n", d1);
printf ("double from float: %.30f\n", d2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这将输出类似的东西(略微修改以显示差异):
double: 0.6999999|99999999955591079014994
double from float: 0.6999999|88079071044921875000000
\_ different beyond here.
Run Code Online (Sandbox Code Playgroud)