none
指数? RRS feed

  • 質問

  • 4710128697246244834921603689 -eq [math]::pow(9,29)

    FALSEになります。TRUEにする方法がありますか。

    [math]::pow(9,29)が丸められるのが問題なんでしょうが、丸めさせない方法ってあるんでしょうか

    2015年3月19日 2:04

すべての返信

  • [math]::pow()はdouble型の値を返すので、10進数としたときは有効数字は15桁となります。

    4710128697246244834921603689 は28桁の数値なので、表現しきれないことになります。

    .NETでは桁数の多い整数を誤差なく扱うためにBigInteger構造体というのが用意されています。

    BigInteger構造体では四則演算の演算子がオーバーロードされていて、int等の数値同様に演算子を用いた演算ができるほか、Pow()を初めとした、BigInteger演算用のスタティックメソッドが定義されています。

    今回の場合だと、

    4710128697246244834921603689 -eq [bigint]::pow(9,29)

    とすればうまくいくかと思います。

    ただし、BigInteger構造体(エイリアスはbigint)が使えるのは.NET Framework 4以降となります。

    参考:BigInteger 構造体 (System.Numerics) 

    2015年3月19日 2:28
    モデレータ
  • Decimal型であれば有効精度28~29桁なのでぎりぎり収まります。しかも.NET 1.0から提供されているので制限はありません。ただし[Math]::Pow()は牟田口大介さんも書かれているようにDouble型しか提供されていないのでどうしても丸められてしまいます。
    # 惜しかった…。
    2015年3月19日 2:42