使用Flash CS4與ActionScript 3中我鍵入以下內容:爲什麼Actionscript爲大數值的模數顯示不同的值?
trace(Math.pow(97,83) % 205);
,如果我在鎢 - 阿爾法鍵入86,導致然而:
97^83 mod 205
我拿到13這是正確的答案。爲什麼actionscript顯示錯誤的值?
謝謝, Y_Y
使用Flash CS4與ActionScript 3中我鍵入以下內容:爲什麼Actionscript爲大數值的模數顯示不同的值?
trace(Math.pow(97,83) % 205);
,如果我在鎢 - 阿爾法鍵入86,導致然而:
97^83 mod 205
我拿到13這是正確的答案。爲什麼actionscript顯示錯誤的值?
謝謝, Y_Y
這是由於浮動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可能使用專門的庫來計算大數字而不會損失精度。我不知道任何這樣的動畫庫3,但谷歌可能會幫助那裏;)
因爲97^83
的結果太大,無法在AS3中正確計算。 見http://en.wikipedia.org/wiki/IEEE_754-2008
雖然你有@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
做什麼,跟蹤(chck ==測試); ??你可以請一些燈光。我很好奇,但不明白。 –
'test'只是一個0和1個字符的字符串。 'parseInt()'用於將字符串'test'轉換爲數字。我所做的是將'test'轉換爲數字,*轉換回字符串*。轉換結果保存爲'chck'。然後,我比較來回轉換測試的結果。結果不匹配,因此我們已經達到了整個數字的極限。 –
感謝您的回答:)...您的建議是什麼?我是否應該將整數分解爲能夠執行該功能的整數? –
谷歌搜索 「AS3的BigInteger」 將產生一些相關結果。 –
我googled as3 biginteger和我碰到as3crypto:|它有點難以理解它是如何工作的,因爲我這樣做: var a:BigInteger = new BigInteger(「50」,10); trace(a.toString(10)); 答案是280.我可以使用任何其他庫嗎? –