为什么Actionscript会显示大值模数的不同值?

时间:2012-04-30 08:48:31

标签: actionscript-3 flash

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

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

结果是86.但是如果我输入Wolfram-Alpha:

 97^83 mod 205

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

谢谢, Y_Y

3 个答案:

答案 0 :(得分: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的任何此类库,但谷歌可能会帮助那里;)

答案 1 :(得分:2)

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

答案 2 :(得分: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