比较C中的相同浮点值

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进入浮球时,丢失的精度aa恢复到双倍时不会重新获得.

如果你将所有这些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)