2011-01-19 3 views
3

のためのFサフィックスを使用する:それは、この?:私はこのようないくつかのコードを参照の数値リテラル

float num2 = ((this.X * this.X) + (this.Y * this.Y)) + (this.Z * this.Z); 
float num = 1/((float) Math.Sqrt ((double) num2)); 
this.X *= num; 
this.Y *= num; 
this.Z *= num; 

しまうように、コンパイラの使用(float)/(float)たか(double)/(float)を使用しようとすると

float num2 = ((this.X * this.X) + (this.Y * this.Y)) + (this.Z * this.Z); 
float num = 1f/((float) Math.Sqrt ((double) num2)); 
this.X *= num; 
this.Y *= num; 
this.Z *= num; 

は、それは問題ではありません2行目の2番目の例は?

EDIT:Btwパフォーマンスに違いはありますか?

答えて

6

実際には、2番目の例では(int)/(float)が使用されます。 Int32は暗黙的にSingleに変換されるので、コンパイラは不平を言っておらず、正常に動作します。あなたがしなければ

言われていること

、それは文句を言うでしょう:

float num = 1.0/((float) Math.Sqrt ((double) num2)); 

これは、それが効果的に(double)/(double)に変わります(double)/(float)を、使用しようとしてしまいます。コンパイラは、そのdoubleが暗黙的にfloat変数に設定されるときに不平を言うでしょう。


EDIT:ところで、パフォーマンスの違いがあるでしょうか?

おそらく測定可能なものではありません。つまり、ILで余分な変換操作を作成するつもりです。これらはJIT中に消滅するかもしれませんが、やはり微視的になるでしょう。それは読むために、コードをより簡単になるため

個人的に、私はおそらく、この使用して倍精度演算を扱うでしょう:

double num2 = (this.X * this.X) + (this.Y * this.Y) + (this.Z * this.Z); 
float num = (float) (1.0/Math.Sqrt(num2)); 
this.X *= num; 
// ... 
+0

。あなたはそれを知っていますか? –

+2

@ジョアン:私は編集しました...ところで - 私の編集ははるかに少ない変換操作もあります;) –

+0

Thanks Reed。私は同意する、私もダブルを常に使用します。第三者の図書館のこのコードだけが私を混乱させました。 –

1

いいえ;それは同じだろう。

1f1.0(または1d)に変更すると、結果はdoubleになります。

+0

おかげで、また別の小さな問題を追加しました。あなたはそれを知っていますか? –

+2

@ Joan: 'double'と' float'の動作の速度は、CPUによって異なります。 – SLaks

+0

ありがとう、もう一つの小さな質問が追加された感謝のSLAKs/ –

関連する問題