Actionscript3でFlashCS4を使用する次のように入力します。
trace(Math.pow(97,83) % 205);
その結果、86になります。ただし、Wolfram-Alphaと入力すると、次のようになります。
97^83 mod 205
正解は13です。actionscriptが間違った値を表示するのはなぜですか?
ありがとう、Y_Y
Actionscript3でFlashCS4を使用する次のように入力します。
trace(Math.pow(97,83) % 205);
その結果、86になります。ただし、Wolfram-Alphaと入力すると、次のようになります。
97^83 mod 205
正解は13です。actionscriptが間違った値を表示するのはなぜですか?
ありがとう、Y_Y
これは、数値タイプの浮動小数点精度によるものです。Flashは、Math.pow(97,83)の結果を表すために64ビットのみを使用し、そのうち53ビットは浮動小数点数の仮数部分を記述するために使用されます。53ビットの場合、数値を丸める前に、数値の精度は約15〜16桁になります。Math.pow(97,83)は約164桁の長さであるため、Flashは7.98093813043768e+164の形式の近似値を保持します。
精度が低下するため、これはMath.pow(97,83)の正確な値ではないため、modの計算時に悪い結果が生じます。
Wolfram-Alphaはおそらく、精度を損なうことなく多数を計算するために専用のライブラリを使用しています。私はActionscript3のそのようなライブラリを知りませんが、グーグルがそこで役立つかもしれません;)
の結果が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