c - 关于 float 和舍入的问题

标签 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;
}

最佳答案

确实与浮点舍入有关。如果您从事实数算术,对于非零 f1/f * f == 1 始终为真。在浮点算术中,通常但并不总是如此。

以41.0为例,1/f的实际算术值为0.024390243902439024390243902439....除法的舍入到浮点结果为0.024390242993831634521484375,这比实际值足够小算术结果:乘法结果小于1。

浮点算术被设计为非常接近真实算术,同时也允许高效的实现。毫不奇怪,它在许多情况下实现了实数不变量,只是不是全部。

关于c - 关于 float 和舍入的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58461093/

相关文章:

c - (C 编程)将 2 个一维数组合并为 1 个多维数组时出现段错误

c - C 中小于运算符还有什么含义?

c - 将 float 舍入为 int

performance - 定点算术值得我费心吗?

c# - 内置 .Net 算法将值四舍五入到最接近的 10 区间

sql-server - SQL Server 中的 *UP* 舍入到最接近的 100

c - 从管道保存到字符串

c - 在C中打印带有月份和年份的日历

performance - ARM7 Cortex A8上的浮点状态传输

objective-c - 浮点比较的最大绝对误差是多少?