2016-05-09 7 views
8

簡単な数学演算でどの変換が良いか(パフォーマンス/スピードと精度/損失が最も少ないか)を知りたいのですが、その違いは何ですか?簡単な数学演算に適した数値型変換はどれですか?

例:

double double1 = integer1/(5 * integer2); 
var double2 = integer1/(5.0 * integer2); 
var double3 = integer1/(5D * integer2); 
var double4 = (double) integer1/(5 * integer2); 
var double5 = integer1/(double) (5 * integer2); 
var double6 = integer1/((double) 5 * integer2); 
var double7 = integer1/(5 * (double) integer2); 
var double8 = Convert.ToDouble(integer1/(5 * integer2)); 
var double9 = integer1/Convert.ToDouble(5 * integer2); 

実は私の質問は、変換ではない型自体についてです。

+1

であるため、float1、float8は整数除算を使用するため、これらの2つを忘れてしまう可能性があります。残りについては、本当に 'integer1'と' integer2'の値が何であるかによって決まります。私はあなたが[this](http://stackoverflow.com/a/15117741/767890)を読む必要があると思います。パフォーマンス上の理由から、 'double9'の理由はありませんが、' double5'と同じですが、間接的な追加によって遅くなります。 – InBetween

+0

浮動小数点演算に関する良いリンク。 – MagB

+0

私が* marginal * winner * performance wise *のために賭けなければならなかった場合、私は 'double4'または' double5'を選びました。そしてそれら2つから、読みやすさのために、私は 'double4'を選びました。 – InBetween

答えて

5

EDIT

最初の行double double1 = integer1/(5 * integer2);は整数の除算を行い、そのことをしてはいけません。

また、var double8 = Convert.ToDouble(integer1/(5 * integer2));の行は、結果をdoubleに変換する前に整数除算を行っているため、どちらも行いません。

それ以外のすべてのアプローチでは、サンプルコードの各行に一度IL命令Conv.R8を呼び出すことになります。

実際の唯一の違いは、Convert.ToDouble()がそうするためのメソッド呼び出しを行うということです。そのようにする必要はありません。

double1double8以外のすべての行の結果は同じになります。

だから、おそらく最も簡単なのために行く必要があります:var double2 = integer1/(5.0 * integer2);

を、より複雑な状況では、タイムコードを任意の違いがあるのですかどうかを確認します。

+0

Thx、私は私の質問を編集しました。参照してください。 – MagB

+0

一般的に、(ダブル)を使用するハードタイプの変換は、5.0または5Dのようなネイティブの数値を使用するよりも遅く、高速ですか?たとえば、次のように比較します。var double6 = integer1 /((double)5 * integer2); VS var double2 =整数1 /(5.0 *整数2)。 – MagB

+2

@MagBそれは違いはありません。私が言ったように、あなたがリストアップしたすべてのコンバートは 'Conv.R8'を呼ぶことになります(サンプルコードの各行に対して一度だけ呼び出されます)。より複雑な状況では、コードに時間差があるかどうかを確認してください。 –

1

代わりにフロート/小数使用のダブル:

一般的な質問「をダブル対​​進」のためのより一般的な答えは:小さなによる影響を受けません科学計算用ダブル金銭的な計算の小数点精度を維持するために、違い。 DoubleはCPU固有の型(内部表現は基数2に格納されている)なので、Doubleで計算した方がDecimalより良く実行されます(内部10進で表されます)。あなたは全く変更された質問に対して

+0

thx。私は私の質問を編集しました。参照してください。 – MagB

2

コードの行の違いはコンバージョンに関するものではなく、一部は全く異なるもので、値は同じではありません。

1. float float1 = integer1/(5 * integer2); 
5 * interger2

intintintを与える分割し、あなたはintfloatより小さな範囲を有するので、暗黙的な変換を使用して、float変数にint値を割り当て、int与えます。 float float1 = 1/(5 * 2)の場合、結果としてSystem.Singleが返されます。

2. var float2 = integer1/(5.0 * integer2); 

5.0は、本質的に5.0dあるので、あなたは結果としてSystem.Double 0.1を取得しますvar float2 = 1/(5.0 * 2)float2の種類は、System.Doubleです。もし上記と同じ値を使用して

3. var float3 = integer1/(5F * integer2); 

は何をしたい、おそらくある、System.Single 0.1を取得します。

4. var float4 = (float)integer1/(5 * integer2); 

あなたは違い3.アイテムと同じになりますがITEM4がfloat divides by intている間ITEM3がint divides by floatです。

5. var float5 = integer1/(float) (5 * integer2); 
6. var float6 = integer1/((float) 5 * integer2); 
7. var float7 = integer1/(5 * (float) integer2); 

3つが、それは、分圧器を構築するだけでさまざまな方法をint divides by float計算するほとんどの項目3と同じです。

この2つは、より高い精度を持つSystem.Decimalの値を与えます。 Item8はitem1と同じ問題があります。Convert.ToDecimalのパラメータがint,

関連する問題