C - 使用if语句比较浮点数

时间:2015-03-16 18:50:05

标签: c floating-point compare

我目前正在编写一个贪婪的算法,但在比较浮点数时我偶然发现了一个问题。

我会使用这样的代码:

float f = 0;   

if (f == 0) {
   // code
}

我已在单独的程序中对此进行了测试,但它运行良好,但不适用于我正在进行的程序。

以下是我自己程序的摘录。

float chf2 = fmod(chf, 0.1);
float ch3 = chf - chf2;

if (chf2 == 0) {

    /* Divide user's number by 0.1 */

    float ch3 = chf / 0.1;

    /* Round the number */

    int ch4 = round(ch3);

    /* Print the amount of coins and end */

    printf("%d\n", ch4 + coin2);
    return 0;
}

奇怪的是,这似乎适用于之前的if语句,用于检查用户输入的fmod为0.25。

有没有更好的方法来检查浮点数是否等于另一个浮点数?

1 个答案:

答案 0 :(得分:2)

您的代码正常运行。但是,您的期望可能需要稍微调整一下。

fmod函数总是返回一个确切的结果---当你写c = fmod(a, b)时,c是一个数字,c + k*b(以无限精度计算)正好等于对于某个整数ak。所以你的代码实际上是正确的--- if (c == 0)会在a恰好是b的倍数时触发。{/ p>

您将b作为double 0.1,实际上是分数3602879701896397/36028797018963968,而不是分数1/10。因此,如果我计算fmod(1, 0.1),我应该得到分数(36028797018963968 % 3602879701896397) / 36028797018963968,即3602879701896395 36028797018963968。这比名为double的{​​{1}}略小。

这也解释了当您使用0.1代替0.25时,您的代码符合您的期望的原因; 0.1完全给你1/4。

您可以阅读this floating-point guide以了解浮点数的表示。