2012-02-21 27 views
1

現在、私は自分の論文を書いており、これまでに見たことのない.NET C#の動作に直面していました。私は計算のエラーについて話しています。 Iは次の式を実装:なぜこの結果は0であり、upsidedownではありませんか?

1/2 *(シータI-1 +シータI)+合計(= 1、I-1 ALPH kを、k)は、この式は、4つのオブジェクトに適用されます。 Thetaは浮動小数点として宣言されたすべてのオブジェクトの値が1,5708です。アルファは0で初期化され、繰り返しごとに増加します。

このバージョンの値を持つ最初のimplmentation

float alpha = 0; 
    float value = 0; 
    for (int sphereCount = 1; sphereCount < this.spheres.Count; sphereCount++) 
    { 
     value = (1/2) * (this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta); 
     alpha += value; 
    } 

は常に0.0であります! だから私はそれを変更:1/2の周りに括弧を削除し、それが働いた計算の最後にそれを配置することによりimplementaion

float alpha = 0; 
    float value = 0; 
    for (int sphereCount = 1; sphereCount < this.spheres.Count; sphereCount++) 
    { 
     value =(this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) * 1/2; 
     alpha += value; 
    } 

作業

なぜですか?

括弧で囲んだ1/2の位置に依存しない場合、結果は0.0です。しかし、私が最後に(1/2)を置くと0.0になります。 ここに誰も理由がありますか?

+0

value =(this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) * 1/2; 

なぜこれを書いていませんか?私はこれが浮動小数点質問だと思う。試してみてください。Console.Out.WriteLine(value); ' –

+1

質問には関係ありませんが、最後の球はどちらにも含まれていません、それは意図的ですか? – harold

+0

@ChrisShain:デバッガを使用しました;-)コンソール出力は不要です。 – Christoph

答えて

8

この

(1/2) 

それは整数の割り算ですので、0に評価されます。あなたは

(1/2f) 

または

(1/(float) 2) 

を言うなら、それはフロートdivsionを強制するので、あなたは大丈夫です。あるいは、さらに良いものは、0.5と書いてください。

+0

ああ男NOOO ...私はC#は、浮動小数点に1/2を変換するためにスマートだと思った... BTW(1/2.0)の結果を使用して二重になるので、全体の結果をfloatにキャストする必要があります。 – Christoph

+0

または2で割ります。 – phoog

+0

@Christoph計算は2倍の値で実行され、最後に切り捨てられて最後に浮動小数点になります。また、C#は浮動小数点演算子と括弧で囲んで明確に分離している場合、 '1/2'計算を浮動小数点数に変換しません。 – phoog

3

結果が整数結果を与える整数除算を使用して計算される場合、1/2を書きます。 1/2fのように、数値の1つを浮動小数点数に変更することによって浮動小数点除算を強制することができます。

または、IMHOが1/2よりも読みやすい0.5と書くことができます。

+1

また、 '/ 2'と書くこともできます。これは' * 1/2'よりも読みやすくなります。 – phoog

0

1/2の代わりに1.0/2または0.5を書きます。 1/2整数演算として扱われ、そのように括弧を取り外し0

に丸められるので

1/2が整数0

0

をもたらす整数除算での順序を変更します今では、全体(浮動小数点)の数式を2で割って、浮動小数点の答えに到達しています。

0

12は浮動小数点値ではない整数値です。

あなたは整数値2により整数値1を分割する場合、結果は整数値0ではなく浮動小数点値0.5あります。

括弧を削除して乗算の順序を変更すると、式の他の部分には最初に1が乗算され、暗黙的に整数値1が浮動小数点値に変換されます。結果は2で除算され、暗黙的に浮動小数点値に変換されます。

だから何あなたがやって終わることは次のとおりです。

value = ((this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta) * (float)1)/(float)2; 
1

1を掛けるのはなぜ?むしろこれより:あなたはそれが0.0である知っていますどのように

value =(this.spheres[sphereCount - 1].Theta + this.spheres[sphereCount].Theta)/2; 
+1

数式を単純化し、 "Thetaは値が1,5708のfloatとして宣言されたすべてのオブジェクトにあります"アルゴリズム全体は 'alpha = this.spheres [0] .Theta * this.spheres.Count;' – Jay

+0

@Jay +1とすることができます。私は直接の質問に対処するために必要以上に深く読まなかった。 – phoog

関連する問題