c++ - 在 C 中比较相同的浮点值

标签 c++ c floating-point floating-accuracy

<分区>

Possible Duplicate:
strange output in comparison of float with float literal

当我尝试比较 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();
}

提前致谢。

最佳答案

虽然许多人会告诉您始终将 float 与 epsilon 进行比较(这通常是个好主意,尽管它应该是被比较值的百分比而不是固定值),但实际上没有必要,因为你正在使用常量。

您的具体问题是:

float a = 0.7;

使用double 常量0.7 创建一个 精度数字(失去一些精度)同时:

if (a == 0.7)

将比较两个 double 精度数字(a 首先提升)。

将 double 0.7 转换为 float a 时丢失的精度在将 a 提升回 double 时不会恢复。

如果您将所有这些 0.7 值更改为 0.7f(以强制 float 而不是 double),或者如果您只是将 a 设为 a double,它会工作得很好——我现在很少使用 float 除非我有大量的 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;
}

这将输出如下内容(稍作修改以显示差异):

double:            0.6999999|99999999955591079014994
double from float: 0.6999999|88079071044921875000000
                            \_ different beyond here.

关于c++ - 在 C 中比较相同的浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850663/

相关文章:

c - 如何更改索引为空的数组值的索引

比较 C 中的两个变量

floating-point - 没有下溢和溢出,是否有任何2个数字,其中A < B为十进制形式,但转换为 float 后A> B?

c++ - 处理 TreeView 鼠标双击

c++ - Qt TCP 套接字 - 写入超过 15 个字节

c++ - 如何在 C++ 中将字符串作为模板类返回?

c++ - 在 CUDA 分配模板函数中弃用了从字符串常量到 'char *' 的转换

c++ - IA64 不符合 float 的 IEEE 标准?

matlab - 四舍五入到 n 位有效数字

c++ - 如何在 Xcode 中选择正确的目的地?