2009-10-10 13 views
5

C#を使用して小さな番号のN番目のルートを取得しようとすると、番号が間違っています。小さな番号のN番目のルートがC#で予期しない結果を返します

たとえば、1.07の3番目のルートを取得しようとすると、1が発生します。これは明らかに真ではありません。

ここでは、3番目のルートを取得するために使用している正確なコードです。

MessageBox.Show(Math.Pow(1.07,(1/3)).toString()); 

どのようにこの問題を解決できますか?

これは浮動小数点演算の問題だと思いますが、どのように処理するのか分かりません。

+2

それが実際に整数の除算の問題です。 1/3は整数として評価され、除算の結果は0になります。したがって、実際には1.07を1の0乗にします。 – tvanfosson

答えて

9

「正確なコード」がコンパイルされないことは確かです。

MessageBox.Show(Math.Pow(1.07,(1/3).toString())); 

toStringの呼び出しは、間違った入れ子のレベルであるToStringメソッドである必要があり、かつ(1/3)は、おそらくあなたが持っている本当の問題である整数の除算、です。 (1/3)が0で0次のものは1です。(1.0/3.0)または(1d/3d)を使用する必要があります。

+0

親愛なるキャプテン風です。間違っているのは残念です)。私は再タイピングの代わりにコピーして貼り付けるべきだった。私は情報を修正しました。素晴らしい答えをありがとう! –

+0

ps。正常に処理されました –

+6

私は通常、明白な構文エラーを指摘しませんでしたが、「正確」という言葉を使用するのが気になるので、何とか義務づけられました。それが助けてくれてうれしい。 –

13

C#は整数として1と3を処置して、次の操作を行う必要があります

Math.Pow(1.07,(1d/3d)) 

または

Math.Pow(1.07,(1.0/3.0)) 

暗黙の拡大変換はあなたが作るなりますので、実際に面白いです間違い。

3

最初のものが最初です。使用して再、可能性があります

MessageBox.Show(Math.Pow(1.07,(1/3).toString())); 

:-)あなたのコンパイラと間違って何かが試してみて、その文字列のパワーに1.07を上げ最初に(1/3).toString()を評価します。

私はあなたが意味すると思う:

MessageBox.Show(Math.Pow(1.07,(1/3)).ToString()); 

が問題としては、(1/3)が0かつn Nの全ての値のために1を返す整数の除算として扱われています。

1.0/3.0のような浮動小数点除算に強制する必要があります。

+0

誤って配置されたことについては申し訳ありません)。私は再タイピングの代わりにコピーして貼り付けるべきだった。私は情報を修正しました。 –

1

これは、あなたが本当のn乗根の精度に問題がある場合に役立つかもしれないが、私の実務経験は、組み込みMath.Pow(ダブル、int型)がより正確であるということです。

private static decimal NthRoot(decimal baseValue, int N) 
    { 
     if (N == 1) 
      return baseValue; 
     decimal deltaX; 
     decimal x = 1M; 
     do 
     { 
      deltaX = (baseValue/Pow(x, N - 1) - x)/N; 
      x = x + deltaX; 
     } while (Math.Abs(deltaX) > 0); 
     return x; 
    } 

    private static decimal Pow(decimal a, int b) 
    { 
     if (b == 0) return 1; 
     if (a == 0) return 0; 
     if (b == 1) return a; 
     if (b % 2 == 0) 
      return Pow(a * a, b/2); 
     else if (b % 2 == 1) 
      return a * Pow(a * a, b/2); 
     return 0; 
    } 
関連する問題