フロートとダブルの違い - どちらを使いますか?

Anonim

読者がコンピュータサイエンスの基礎を知っていることを前提としています)。

コンピュータサイエンスに登録されている多くの初心者プログラマー/学生は、彼らが勉強しているコンピュータサイエンスの特定分野に関連するよくある質問を尋ねます。ほとんどの初心者コースは、 バイナリ 、 小数 、 8進数 、および 16進数 などの最新のコンピュータで使用される数値システムのトピックから始まります。システム。これらは、コンピュータ(または電卓や他の種類のデジタルコンピュータ)の数値の内部表現であるコンピュータ数値形式です。これらの値は「ビットのグループ化」として格納されます。

<!コンピュータは、バイナリ数字の組のデータを表す(すなわち、

1s 0s の組み合わせ、例えば、1111 は10進数で999を表す)、計算/数値処理の基本ブロックを構成するため、動的数値範囲を表すために使用されるさまざまな数値形式について教えることが理にかなっていますどんな種類の操作でも。数学系が教室で定義されると(しばしば不十分である)、学生は一定の精度と数の範囲を持つ同じタイプ(すなわち、 浮動小数点算術 )で異なる数のフォーマットに移動することを夢見ている。したがって、彼らは特定のタイプ間のニュアンスを学ばなくてはならない。最も一般的に使用されるデータ型の2つは Float Double であり、同じニーズ(すなわち 浮動小数点演算 )を対象としていますが、内部表現のいくつかの違いと、プログラムの計算に対する全体的な影響。多くのプログラマがFlatデータ型とDoubleデータ型のニュアンスを見逃してしまい、最初に使用しないでください。最終的には、プログラムの他の部分で誤った計算が行われます。 <! - 2 - > この記事では、Cプログラミング言語のコード例を使ってfloatとdoubleの違いを説明します。始めましょう! フロート対ダブル…どうしたの? FloatとDoubleは、浮動小数点算術演算に使用されるデータ表現であり、数学クラスで計算した10進数を考えると、

20です。 123 999、964。 239、999。それらは整数ではない(すなわち、2 9 9 9 9 9 9 9 9 9 9 9などである)ので、それらはバイナリの分数。得られた10進数(すなわち、9,12,123,9,16,23,99など)として、)は、通常のバイナリ形式(すなわち、整数)で容易に表現することはできない。 FloatとDoubleの主な違いは、前者が単精度(32ビット)浮動小数点データであり、後者が倍精度(64ビット)浮動小数点データ型であることです。 Doubleは、基本的にFloatの倍精度バージョンであるため、「double」と呼ばれます。あなたが巨額を計算している場合(数字の何千もの数字を考えると)、Doubleで不正確さが小さくなり、多くの精度を失うことはありません。

<! - > - <! - 1 - >

コード例を使って詳しく説明することをお勧めします。

#include int main(){ float num1 = 1; f / 82; float num1 = 1; float num2 = 0; (int i = 0; i <738; ++ i)999 num2 + = num1; printf( "%。7g n"、num2); 倍num3 = 1.0 / 82; <! - 2 - > double num4 = 0; (int i = 0; i <738; ++ i); num4 + = num3; printf( "%。15g n"、num4); getchar(); } 以下を印刷します。 9。 。 99999999999983 ここで、FloatとDoubleの精度のわずかな違いは、DoubleがFloatよりも正確であるように見えますが、まったく別の答えを与えることがわかります。 <! C#のsqrt()関数の例を次に示します。#include #include int main(){

float num1 = sqrt(2382719676512365。1230112312312312 );

倍num2 = sqrt(2382719676512365。1230112312312312);

printf( "%f n"、num1);

printf( "%f n"、num2);

getchar();

}

次の出力を出力します。

48813108。 000000 999 48813109。 678778

ここで、Doubleでの答えがより良い精度を持つことがわかります。

C言語でのいくつかの標準的な数学関数が動作するので、Doubleと浮動小数点演算にDoubleを使用する方が良いです。Doubleと現代のコンピュータは、Double浮動小数点計算に非常に高速で効率的です。これは、多くの浮動小数点数で動作する必要があるか(数値に0が何千もある大規模な配列を考える)、または二重浮動小数点数をサポートしないシステムで動作している場合を除き、Floatを使用する必要性を減らします。いくつかのプラットフォーム(ARM Cortex-M2、Cortex-M4など)ではDoubleをサポートしていないため、Floatを使用する必要があります。さらに、ベクトル/行列の計算のように、特定のGPU / CPUがフロート処理でより効率的に動作することを覚えておく必要があります。そのため、ハードウェア仕様のマニュアル/ドキュメントを参照して、特定のマシンの場合

現代のコンピュータをターゲットとするコードでは、Doubleの代わりにFloatを使用する理由はほとんどありません。ダブルの余分な精度は、プログラムの他の部分で問題を引き起こす可能性のある丸め誤差やその他の不正確さを減らしますが、排除しません。多くの数学関数や演算子はDoubleを変換して返すので、精度を失う可能性があるため、数値をFloatにキャストする必要はありません。浮動小数点演算の詳細な解析については、このすばらしい記事(http:// docs。oracle。com / cd / E19957-01 / 806-3568 / ncg_goldberg.html)を読むことを強くお勧めします。

要約

要するに:

Floatを使用する場所:

単精度が倍精度よりも高速なハードウェアをターゲットにしている場合。

あなたのアプリケーションは、数千の0を持つ数千の数字のような浮動小数点演算を大量に使用します。

あなたは非常に低レベルの最適化を行っています。たとえば、一度に複数の数値/配列/ベクトルで動作する特殊なCPU命令(SSE、SSE2、AVXなど)を使用しているとします。

<!結論

この記事では、FloatとDoubleの違いと、特定の場所でどちらを使うべきかを強調しました。おそらく、Double浮動小数点演算の使用による低効率の可能性は非常に低いため、現代のコンピュータをターゲットにしている場合は特に、Doubleをほとんどの場所で盲目的に使用する方がよいでしょう。ご不明な点がございましたら、下記のコメント欄にお尋ねください!

<! - 2 - >