我的代码是
let m = 39
let maxPower = pow(3.0, Double(m))
if (Int(maxPower) % 3) == 0 {
return true
} else {
return false
}
为什么会返回false?
答案 0 :(得分:1)
在我看来你遇到了限制。
把它放在一个操场上,你会看到它一直工作到m为37或更高。
func testIt(m: Int, value: Double) -> Bool {
let maxPower = pow(value, Double(m));
if (Int(maxPower) % 3) == 0 {
return true;
} else {
return false;
}
}
testIt(3, value: 3.0) // true
testIt(4, value: 3.0) // true
testIt(5, value: 3.0) // true
testIt(6, value: 3.0) // true
testIt(35, value: 3.0) // true
testIt(36, value: 3.0) // true
testIt(37, value: 3.0) // false
testIt(38, value: 3.0) // false
testIt(39, value: 3.0) // false
testIt(40, value: 3.0) // crash
答案 1 :(得分:1)
这是由于Swift中的Double
的精度(以及一般的浮点数)。运行
let power = pow(3.0, Double(39))
print(power)
将打印 4.05255515301898e + 18 ,但3 39 的实际值为 4.052555153018976267e + 18 ,或 4052555153018976267 < / strong>(注意最后的76267)
运行时
let mod = 4052555153018976267 % 3
值如预期的那样0.正如rob mayoff所指出的,双精度的实际存储值是 4052555153018976256 。运行时
let mod = 4052555153018976256 % 3
结果为1,这就是您的体验。这就是运行
时value
等于1的原因
let value = pow(3.0, Double(39)) % 3