关于浮点和舍入的问题

时间:2019-10-19 06:26:40

标签: c floating-point rounding

1 / f * f在数学上应等于1。我用下面的代码测试了这个身份,对于f = 41.000000和f = 47.000000来说不是真的。

我认为这与浮点或舍入有关,但不知道原因。 是什么导致这个结果?

#include <stdio.h>

int main(void) {
    float f;

    for (f = 1; f < 50; f += 1) {
        if (1 / f * f != 1)
            printf("f=%f\n", f);
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

它确实与浮点舍入有关。如果您使用实数运算,则对于非零f1/f * f == 1始终为true。在浮点运算中,通常但并非总是如此。

以41.0为例,1/f的实际算术值为0.024390243902439024390243902439 ....除法的四舍五入结果为0.024390242993893834534521484375,这比实际算术结果小得多的乘积小于1。

浮点算术被设计为与实际算术非常接近,同时还允许高效实现。在很多情况下,即使不是全部,它都能实现实数不变也就不足为奇了。