【问题标题】:Why 2 ^ 3 ^ 4 = 0 in Julia?为什么 2 ^ 3 ^ 4 = 0 在 Julia 中?
【发布时间】:2015-06-11 00:50:47
【问题描述】:

我刚从 Quora 上看到一篇文章: http://www.quora.com/Is-Julia-ready-for-production-use

在底部,有一个答案说:

2 ^ 3 ^ 4 = 0

我自己试过了:

julia> 2 ^ 3 ^ 4
0

我个人认为这不是语言中的错误。为了清楚起见,我们可以为 Julia 和我们人类添加括号:

julia> (2 ^ 3) ^ 4
4096

到目前为止一切顺利;但是,这不起作用:

julia> 2 ^ (3 ^ 4)
0

由于我正在学习,我想知道,Julia 如何将此表达式评估为 0?评价先例是什么?

julia> typeof(2 ^ 3 ^ 4)
Int64

【问题讨论】:

标签: julia


【解决方案1】:

我很惊讶我在 SO 上找不到关于这个的重复问题。我想我的回答与the FAQ in the manual 略有不同,因为这是一个常见的第一个问题。 糟糕,我不知何故错过了:Factorial function works in Python, returns 0 for Julia

假设您学过加法和乘法,但从未学过任何高于 99 的数字。就您而言,根本不存在比这更大的数字。所以你学会了将一个带入十列,但你甚至不知道你将携带十位的那一列叫什么。所以你把它们扔掉。只要你的数字永远不会超过 99,一切都会好起来的。一旦你超过 99,你就会回到 0。所以 99+3 ≡ 2 (mod 100)。和 52*9 ≡ 68 (mod 100)。任何时候你用超过两个 10 的因数进行乘法运算,你的答案都是零:25*32 ≡ 0 (mod 100)。现在,在你每次计算之后,有人可能会问你“你超过 99 了吗?”但这需要时间来回答……时间可以用来计算你的下一个数学问题!

这实际上是计算机在本机进行算术运算的方式,除了它们以 64 位二进制进行运算。您可以使用bits 函数查看各个位:

julia> bits(45)
"0000000000000000000000000000000000000000000000000000000000101101"

当我们将其乘以 2 时,101101 将向左移动(就像十进制乘以 10):

julia> bits(45 * 2)
"0000000000000000000000000000000000000000000000000000000001011010"
julia> bits(45 * 2 * 2)
"0000000000000000000000000000000000000000000000000000000010110100"
julia> bits(45 * 2^58)
"1011010000000000000000000000000000000000000000000000000000000000"
julia> bits(45 * 2^60)
"1101000000000000000000000000000000000000000000000000000000000000"

……直到它开始从末端掉下来。如果将 64 个以上的二相乘,则答案将始终为零(就像上面示例中将两个以上的十相乘一样)。我们可以询问计算机是否溢出,但默认情况下,每次计算都有some serious performance implications。所以在 Julia 中你必须是明确的。您可以要求 Julia 在特定乘法后进行检查:

julia> Base.checked_mul(45, 2^60) # or checked_add for addition
ERROR: OverflowError()
 in checked_mul at int.jl:514

或者您可以将其中一个参数提升为 BigInt:

julia> bin(big(45) * 2^60)
"101101000000000000000000000000000000000000000000000000000000000000"

在您的示例中,当您使用大整数运算时,您可以看到答案是 1 后跟 81 个零:

julia> bin(big(2) ^ 3 ^ 4)
"1000000000000000000000000000000000000000000000000000000000000000000000000000000000"

更多详情,请参阅常见问题解答:why does julia use native machine integer arithmetic?

【讨论】:

  • 啊,你的解释真的很棒。我只在 quora 帖子中注意到 Matlab 可以做到这一点(因为您引用的帖子中的人只注意到 python 可以做到这一点),而没有过多地考虑大量溢出。我在想如果 Matlab、Python 能做对,为什么 Julia 不能呢? - 那是错的。非常感谢!
  • Matlab 通过默认使用浮点数并在其显示中四舍五入来解决这个问题。如果你真的使用整数,你会大吃一惊。试试int64(2) ^ (3 ^ 4)
  • 嗯,是的,这个 matlab 计算让我吃惊! >> int64(2) ^ (3 ^ 4) ans = 9223372036854775807 大整数和浮点数通常是陷阱!
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多