【问题标题】:R not calculating large cubes correctly?R没有正确计算大立方体?
【发布时间】:2019-09-11 17:38:14
【问题描述】:

最近有消息称,发现了三个总和为 42 的立方体。即 Andrew Sutherland 和 Andrew Booker 发现 (-80538738812075974)^3 + 80435758145817515^3 + 12602123297335631^3=42 (https://math.mit.edu/~drew/)

我稍微修改了一下,但我在 R 中没有得到 42。

我确实在其他地方得到它(WolframAlpha),但 R 给了我这个:

> (-80538738812075974)^3 + 80435758145817515^3 + 12602123297335631^3
[1] 1.992544e+35

知道我做错了什么吗?它是R中大量数字的限制吗?还是我(很可能)只是在做一些愚蠢的事情?

【问题讨论】:

    标签: r


    【解决方案1】:

    更新

    正如@MrFlick 所指出的,这是众所周知的浮点运算issue。 R 在您的示例中将大量数字存储为双精度数字。

    另外,请注意integer overflow。请参阅相关讨论 here。请注意,当整数溢出发生时,base R 不会抛出错误(只是警告)。bit64 包有时可能会有所帮助,但在您的情况下不会完成这项工作,它提供的准确性是还是不够。

    【讨论】:

    • 实际上,R 不会将这样的非常大的数字视为整数。 R 会将其存储为“数字”值,在这种情况下将是双浮点数(请参阅typeof(80538738812075974))。所以这里没有整数溢出错误信息。如果您实际使用整数,R 将抛出整数溢出警告(请参阅2e9L + 2e9L)。这实际上更多是关于与大多数现代编程语言共享的well known problems with floating point arithmetic
    • @MrFlick 感谢您的评论。我编辑了我的帖子并感谢您的贡献。
    【解决方案2】:

    如果您想使用R 中的大(整数)数进行计算,您可以使用gmp 库,例如:

    library(gmp)
    as.bigz("-80538738812075974")^3 + as.bigz("80435758145817515")^3 + as.bigz("12602123297335631")^3
    #[1] 42
    
    #or even better use also Integer in the exponent:
    as.bigz("-80538738812075974")^3L + as.bigz("80435758145817515")^3L + as.bigz("12602123297335631")^3L
    

    正如@mrflick 已经指出的那样,您正在使用numeric - double。所以计算结果大致正确。使用Integer 时会收到警告,R 会将其转换为numeric

    (-80538738812075974L)^3L + 80435758145817515L^3L + 12602123297335631L^3L
    #[1] 1.992544e+35
    #Warning messages:
    #1: non-integer value 80538738812075974L qualified with L; using numeric value 
    #2: non-integer value 80435758145817515L qualified with L; using numeric value 
    #3: non-integer value 12602123297335631L qualified with L; using numeric value 
    

    请注意,您必须将string 提供给as.bigz。写入数字时,R 会将其视为双精度数或将大整数数字转换为双精度数,可能会丢失精度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2013-08-09
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多