【问题标题】:Objective-C floating point addition error [duplicate]Objective-C浮点加法错误[重复]
【发布时间】:2012-12-19 15:12:24
【问题描述】:

可能重复:
Trouble with floats in Objective-C

我已将这个问题分解为尽可能简单。随意尝试相同的事情并告诉我您是否遇到相同的错误以及您可能有什么解决方案。我已经在几台电脑上试过了。

float total = 200000.0f + 154196.8f;
NSLog(@"total: %f", total);

输出是:

total: 354196.812500

如果有人有任何合乎逻辑的解释,请随时分享。

【问题讨论】:

  • 为什么用与 Xcode 无关的xcode 标记?
  • Xcode 是我在发生这种情况时使用的环境。下次尽量不要更改别人的帖子。
  • 没有。最好的实现是 OS X 和 GCC/clang(无论哪个)。问题与您使用另一个 IDE 相同。
  • 这与 Objective-C 或环境无关 - 它只是浮点数学的工作方式。
  • @KrisGellci 超过 2000 个代表的“编辑”功能是有原因的。下次尽量不要咄咄逼人和无知。

标签: objective-c floating-point


【解决方案1】:

【讨论】:

  • 双重工作,我知道浮点数不准确,我很惊讶我不能做一个简单的 .80 + .00
【解决方案2】:

请参阅What Every Programmer Should Know About Floating-Point Arithmetic 以获得所有深刻的理解。简短的回答是,所有浮点表示对其精度都有限制,并且可以用十进制的少量数字表示的事物可能无法用二进制的少量数字表示(特别是不能以浮点格式表示) )。

请注意,虽然double 可以改善事情,但它不是灵丹妙药。即使使用double,舍入误差也很常见。当您期望 2 时,您可能很容易得到 1.99999999。

【讨论】:

    【解决方案3】:

    提示:

    long double total = 200000.0 + 154196.8;
    NSLog(@"total: %Lf", total);
    

    在我的机器上打印正确的值。
    32位浮点数有23位尾数,最接近的值为0.5+0.25+0.125。
    您应该使用更多位来获得正确的表示。

    【讨论】:

    • 更多位会变得更接近,但即使是 10,000 位二进制浮点数也不能表示 0.8。这就是问题的症结所在。您不能用二进制浮点数表示 4/5,因为分母必然是 2 的幂。这就像试图将 1/3 精确地表示为以十进制为底的小数。 0.3333 收敛,但永远不会到达。
    猜你喜欢
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2013-01-29
    • 2011-06-09
    相关资源
    最近更新 更多