【问题标题】:Question about floating point and rounding [duplicate]关于浮点和舍入的问题[重复]
【发布时间】:2019-10-19 06:26:40
【问题描述】:

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

【问题讨论】:

  • result was 41.000000 47.000000 - 究竟是什么意思???为什么这里有两个数字?你期待什么(其他)结果?为什么不直接printf("result=%f\n", 1 / f * f); 找出答案?
  • 更好的是:printf("result=%.12f\n", 1 / f * f); 并找出答案
  • C 浮点数不支持任意分数。请先在纸上使用除法计算,然后再乘以,您将永远不会得到那个 1。

标签: c floating-point rounding


【解决方案1】:

确实和浮点数舍入有关。如果您在实数运算中工作,对于非零 f1/f * f == 1 将始终为真。在浮点算术中,通常但并不总是正确。

以 41.0 为例,1/f 的实际算术值为 0.024390243902439024390243902439.... 除法的四舍五入结果为 0.024390242993831634521484375 的实际算术结果足够小乘法小于 1。

浮点算术被设计为与实数算术非常接近,同时还允许高效实现。它在许多情况下都实现了实数不变,这并不奇怪,只是不是全部。

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2020-08-04
    • 1970-01-01
    • 2011-08-25
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多