做简单数学时的奇怪结果

时间:2016-03-10 01:50:47

标签: swift math

我的代码是

let m = 39
let maxPower = pow(3.0, Double(m))

if (Int(maxPower) % 3) == 0 {
  return true
} else {
  return false
}

为什么会返回false?

2 个答案:

答案 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