为什么在达到 Double Max 之前 Double 达到 `Double.infinity`?
Why does Double reach `Double.infinity` BEFORE Double Max is reached?
我写了一个很小的 Swift 程序来将一个数字加到前面的数字上,直到它达到无穷大。但是,在达到双最大值之前达到无穷大。
- 双限为1.79769313486232e+308
- 距离限制为 4.90703911098917e+307
- 然而,8.07763763215622e+307 + 1.3069892237634e+308 达到无穷大
这是为什么? (我在下面回答了这个问题。)
运行 自己动手:
import Foundation
import Darwin
var current: Double = 1
var previous: Double = 0
var register: Double = 0
var infinity = Double.infinity
var isInfinite = infinity.isInfinite
var n = 1
while current < infinity {
register = current
current = previous + register
print("\(n): \(current)")
guard current != infinity else { break }
previous = register
n += 1
}
print("\n")
print("Double limit is \(DBL_MAX)")
print("Distance to limit is \(DBL_MAX - register)")
print("Yet, \(previous) + \(register) reached infinity")
添加后:
print((DBL_MAX - register) - previous)
到我的代码结束时,我意识到我的错误是没有完全掌握 e+
符号。
因此,上面打印出:
-3.17059852116705e+307
证明Double Max在最后的计算中超标了,证明了为什么会达到无穷大。
嗯,我已经在 public 完成了我的学习!
我写了一个很小的 Swift 程序来将一个数字加到前面的数字上,直到它达到无穷大。但是,在达到双最大值之前达到无穷大。
- 双限为1.79769313486232e+308
- 距离限制为 4.90703911098917e+307
- 然而,8.07763763215622e+307 + 1.3069892237634e+308 达到无穷大
这是为什么? (我在下面回答了这个问题。)
运行 自己动手:
import Foundation
import Darwin
var current: Double = 1
var previous: Double = 0
var register: Double = 0
var infinity = Double.infinity
var isInfinite = infinity.isInfinite
var n = 1
while current < infinity {
register = current
current = previous + register
print("\(n): \(current)")
guard current != infinity else { break }
previous = register
n += 1
}
print("\n")
print("Double limit is \(DBL_MAX)")
print("Distance to limit is \(DBL_MAX - register)")
print("Yet, \(previous) + \(register) reached infinity")
添加后:
print((DBL_MAX - register) - previous)
到我的代码结束时,我意识到我的错误是没有完全掌握 e+
符号。
因此,上面打印出:
-3.17059852116705e+307
证明Double Max在最后的计算中超标了,证明了为什么会达到无穷大。
嗯,我已经在 public 完成了我的学习!