所以我一直在玩BigInteger实现,我发现了一些奇怪的东西......
这段代码:
let largeInt: UInt64 = UInt64(pow(Double(2), Double(64)))
我预计它会崩溃..但是相反,largeInt等于0.之后,如果我尝试使用largeInt,我会得到意想不到的结果。
例如,这个:
let int1: UInt64 = largeInt - 1
再次,我预计它会崩溃(0 - 1显然不是有效的unsigned int)。但是,在调试器中它不会崩溃,我看到一个值为3472(??)。关于发生了什么的任何想法?
编辑: 实际上它看起来像第二行确实导致崩溃,但直到函数结束(我设置int1后我在行上有一个断点)。 largeInt仍然不会导致崩溃。
答案 0 :(得分:2)
对我来说这看起来像个错误。
let p1 = pow(Double(2), Double(64))
大于UInt64.max
,因此
let x1 = UInt64(p1)
应该崩溃(或者作为近似值返回UInt64.max
)。
“下一个较小的”浮点双变量
let p2 = nextafter(p1, 0.0)
let x2 = UInt64(p2)
// 18446744073709549568
正确转换,“下一个更大”的浮点双变量 无法正确转换
let p3 = nextafter(p1, DBL_MAX)
let x3 = UInt64(p3)
// fatal error: floating point value can not be converted to UInt64
// because it is greater than UInt64.max