【问题标题】:Problem with adding two double values in objective c在目标 c 中添加两个双精度值的问题
【发布时间】:2011-09-23 05:23:55
【问题描述】:

我正在为 iphone 和 ipad 编写一个应用程序,我的程序需要添加两个双精度值来获得一个双精度值。问题是当一个双精度值相当大(例如:2^100)而另一个像 1 或 2 一样非常小时,将这两个双精度值相加的结果是错误的,或者它甚至不进行加法.有谁知道这是为什么以及是否有解决方法。谢谢。

【问题讨论】:

    标签: iphone c ipad double


    【解决方案1】:

    这与obj-c无关。 double 是存储浮点值的 64 位数据类型。在十进制中,双精度数可以容纳大约 15.955 位的精度。但是,您的 2^100 数字大约有 30 个十进制数字。因此,如果您尝试向其中添加大约 1 万亿的任何内容,您会发现添加不起作用,因为它超出了您的数字的精度范围。

    为了解决这个问题,您可以使用NSDecimalNumber,它最多可以保存 38 位十进制数字的精度。

    【讨论】:

    • 有趣的是,当我将 2^100 与另一个 2^100 相加时,一切正常,但是当我将 2^100 添加到像 1 这样的小数字时,它保持不变并且不添加1 到 2^100 这就是我不明白的。
    • @Milad: 2^100 + 2^100 可以正常工作。将双精度数视为科学记数法(因为它基本上就是这样,二进制除外)。谷歌说 2^100 是 1.2676506 × 10^30。如果您以“常规”形式将其写出来,您会注意到很多 0。但实数并不包含所有这些 0。科学记数法数字遇到了精度限制——你会注意到小数点后只有 7 位数字。这是因为浮点数的精度大约为 7 位小数。如果这是双倍,大约有 15 个。
    • @Milad:我希望很明显为什么添加 2^100 + 2^100 很容易,因为将 1.2676506 × 10^30 添加到 1.2676506 × 10^30 很容易(你会得到 2.5353012 × 10 ^30)。但是如果你加 1,你将如何写出来呢?您不能不向该号码添加另外 23 位数字,并且这些数字没有空间。基本上,当你写 2^100 时,你得到的是一个代表该区域大约 1 万亿个数字的数字,因为任何计算这些千万亿数字的尝试都将返回与 2^100 相同的结果。
    • 嗨凯文。非常感谢您的回答,现在更清楚了。我尝试了 nsdecimalnumber 并且它可以正确添加,但它仍然有局限性。在我的应用程序中,数字非常大(最大值约为 2^200),甚至 nsdecimalnumber 也无法处理这样的添加数字。是否有可能做我想做的事情(例如:将 2^200 和 4 加在一起)还是我应该尝试其他方法?
    • @Milad:那里有任意精度的算术库。维基百科有一个list of them。听起来你需要走那条路。
    【解决方案2】:

    对于任何处理浮点数的人来说,这都是一本好书:

    http://en.wikipedia.org/wiki/Floating_point

    你描述的情况是完全正常的,是浮点在计算机上工作的自然结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多