2017-07-31 21 views
2

私は簡単にしましょう。結果は70何が問題になっていますがでなければならないとき、私はモジュロ - 計算エラー

alert((Math.pow(7,35))%71) 

を計算しようとしているが、それは私に61を与えますか?

+5

JavaScriptの数字の精度を超えています。 – Pointy

+0

問題を解決する方法はありますか? –

+0

無限精度の固定小数点ライブラリを見回すことができます。 – Pointy

答えて

2

Math.pow(7,35の前に述べたように、この数はJavascriptで処理するには大きすぎます。

問題を解決するには、外部のjavascriptライブラリを使用する必要があります。 (または独自に書き込みます)

大きな数字を扱うJavascriptライブラリの例を次に示します。

  • Bignumber
  • BigNum

    1. 私はそれが役に立てば幸い。

    2

    使用している番号がjavascriptには大きすぎます。 intの最大サイズは2^53 - 7^35未満です。

    0

    精度がより高い唯一の値は中間結果です。したがって、問題のある中間結果を必要としないアルゴリズムを使用している場合は、精度の高い変数を必要とせずに問題を回避することもできます。
    (ab)%c =(a%c)(b%c)%c
    これは、次の式を使用すると便利です。 (7,17)%71)*(Math.pow(7,18)%71))%71.
    中間結果は小さくなりましたが、依然として大きすぎる可能性があります。したがって、さらに分割して、より小さい中間結果でモジュラ演算子を適用する必要があります。
    ですから、このような何か行うことができます。 Math.pow((Math.pow(7,7)%71)、5)%71

    をしかし、あなたはおそらく、整数のためにこれを行う必要があります(可変であるWICHそうしないと、結果をハードコーディングすることによって問題を回避できたはずです)。 したがって、予想できる値の範囲についての考え方と、入力が期待される範囲内にあるときに十分に小さい結果を持つ部分にパワー計算を分割するアルゴリズムを定義する必要があります。

    そして、このような計算のために選んだものであれば、精度の高い変数(特殊なライブラリを使用して)や指定されたアルゴリズムを使って計算する場合は、必ず入力をアサートして、正しい値を提供することができます。さもなければ、あなたの実装は、それが有効である範囲を認識していない人にとっては信頼できなくなります。それ以外の場合は、どの入力または入力の組み合わせに問題があるのか​​、その理由を明確に伝えるメッセージで例外を返します。