4

将 Flash CS4 与 Actionscript 3 一起使用,我键入以下内容:

 trace(Math.pow(97,83) % 205);

结果为 86。但是,如果我输入 Wolfram-Alpha:

 97^83 mod 205

我得到 13 这是正确的答案。为什么 actionscript 显示错误的值?

谢谢,Y_Y

4

3 回答 3

9

这是由于 Number 类型的浮点精度。Flash 仅使用 64 位来表示 Math.pow(97,83) 的结果,其中 53 位用于描述浮点数的尾数部分。使用 53 位,在需要舍入之前,您只能获得大约 15-16 位的精度。由于 Math.pow(97,83) 是一个大约 164 位长的数字,因此 Flash 保留了 7.98093813043768e+164 形式的近似值

由于精度损失,这不是 Math.pow(97,83) 的确切值,因此在计算 mod 时会产生不好的结果。

Wolfram-Alpha 可能使用专门的库来计算大数而不损失精度。我不知道 Actionscript 3 有任何此类库,但谷歌可能会在那里提供帮助;)

于 2012-04-30T09:49:53.203 回答
2

因为结果97^83太大而无法在 AS3 中正确计算。见http://en.wikipedia.org/wiki/IEEE_754-2008

于 2012-04-30T09:51:09.553 回答
1

虽然您在上面有@Godfather 的正确答案,但这是我的 5 美分。

var test:String = "";

// a binary number with bit 53 up
test += "10000000"; // 8
test += "00000000"; // 16
test += "00000000"; // 24
test += "00000000"; // 32
test += "00000000"; // 40
test += "00000000"; // 48
test += "00000";    // 53

trace("test", test);
trace(parseInt(test, 2).toString(2) == test); // true

test += "1"; // bit 0 and 54 up, the rest -- down

var chck:String = parseInt(test, 2).toString(2);
trace("test", test);
trace("chck", chck);
trace(chck == test); // false

这产生:

test 10000000000000000000000000000000000000000000000000000
true
test 100000000000000000000000000000000000000000000000000001
chck 100000000000000000000000000000000000000000000000000000
false

因此,您最多可以使用整数

dec: 9007199254740991
hex: 1FFFFFFFFFFFFF
bin: 11111111111111111111111111111111111111111111111111111

这是另一个示例:

trace(parseFloat("9007199254740993") == parseFloat("9007199254740992"));
// output: true
于 2012-04-30T15:16:00.767 回答