16

C++ には、float、double、long double の 3 つの浮動小数点型があります。コードで浮動小数点を使用することはめったにありませんが、使用すると、次のような無害な行で常に警告が表示されます

float PiForSquares = 4.0;

問題は、リテラル 4.0 が float ではなく double であることです。これはイライラします。

整数型には、short int、int、long int がありますが、これは非常に簡単です。なぜCにはショートフロート、フロート、ロングフロートがないのですか? では、「ダブル」は一体どこから来たのでしょうか。

編集:浮動小数点型間の関係は整数の関係に似ているようです。double は少なくとも float と同じ大きさでなければならず、long double は少なくとも double と同じ大きさでなければなりません。精度/範囲のその他の保証は行われません。

4

12 に答える 12

34

「単精度」と「倍精度」という用語は FORTRANに由来し、C が発明されたときにすでに広く使用されていました。1970 年代初期のマシンでは、単精度の方がはるかに効率的であり、今日と同様に、倍精度の半分のメモリを使用していました。したがって、これは浮動小数点数の妥当なデフォルトでした。

long doubleIEEE 規格が Intel 80287 浮動小数点チップを許可したときに追加されました。これは、従来の 64 ビット倍精度の代わりに 80 ビット浮動小数点数を使用していました。

質問者は保証について間違っています。現在、ほぼすべての言語が IEEE 754 バイナリ浮動小数点数を単精度 (32 ビット) および倍精度 (64 ビット) で実装することを保証しています。拡張精度(80 ビット) を提供するものもあり、C では として表示されlong doubleます。William Kahan が先頭に立った IEEE 浮動小数点標準は、利便性よりも優れたエンジニアリングの勝利でした。当時のマシンでは法外に高価に見えましたが、今日のマシンでは非常に安価であり、IEEE 浮動小数点の移植性と予測可能性は-ポイント数は、毎年何兆ドルも節約する必要があります。

于 2008-12-30T02:45:02.383 に答える
25

あなたはおそらくこれを知っていましたが、リテラルの浮動小数点数/長い倍精度浮動小数点数を作成できます

 float f = 4.0f;
 long double f = 4.0l;

ほとんどの人が使用しているため、Double がデフォルトです。long double はやり過ぎかもしれませんし、float は精度が非常に悪いかもしれません。Double は、ほぼすべてのアプリケーションで機能します。

ネーミングの理由は?ある日、私たちが持っていたのは 32 ビットの浮動小数点数だけでした (実際、私たちが持っていたのは固定小数点数だけでしたが、余談です)。とにかく、浮動小数点が現代のアーキテクチャで一般的な機能になったとき、C はおそらく当時の言語であり、「float」という名前が付けられました。理にかなっているように見えました。

当時、double は考えられていたかもしれませんが、16 ビットまたは 32 ビットであった当時の CPU/fp CPU には実際には実装されていませんでした。double がより多くのアーキテクチャで使用されるようになると、C はおそらくそれを追加するようになりました。C では、float の 2 倍のサイズの名前が必要だったので、double を取得しました。その後、誰かがさらに精度を必要とし、私たちは彼が狂っていると考えました。とにかく追加しました。quadtuple(?) という名前はやり過ぎでした。ロングダブルで十分で、誰も大騒ぎしませんでした。

混乱の一部は、古き良き「int」が時間とともに変化するように見えることです。以前は、「int」は 16 ビット整数を意味していました。ただし、Float は32 ビット IEEE 浮動小数点数としてIEEE stdにバインドされます。そのため、C は float を 32 ビットとして定義したままにし、より長い標準を参照するために double と long double を作成しました。

于 2008-12-29T23:49:36.840 に答える
5

リテラル

問題は、リテラル 4.0 が float ではなく double であることです。これはイライラします。

定数には、整数と浮動小数点数の間に重要な違いが 1 つあります。使用する整数型を決定するのは比較的簡単ですが (値を保持するのに十分小さいものを選択しますが、符号付き/符号なしの複雑さが増します)、浮動小数点数の場合はそれほど簡単ではありません。多くの値 (0.1 のような単純なものを含む) は浮動小数点数で正確に表すことができないため、型の選択はパフォーマンスだけでなく結果の値にも影響します。この場合、C 言語の設計者はパフォーマンスよりも堅牢性を優先したようで、デフォルトの表現をより正確なものにする必要があると判断しました。

歴史

なぜCにはショートフロート、フロート、ロングフロートがないのですか? では、「ダブル」は一体どこから来たのでしょうか。

「単精度」と「倍精度」という用語は FORTRAN に由来し、C が発明されたときにすでに広く使用されていました。

于 2008-12-30T13:39:43.733 に答える
2

まず、これらの名前は C++ に固有のものではありませんが、IEEE 754 を実装する浮動小数点データ型ではかなり一般的な方法です。

「double」という名前は「倍精度」を指しますが、float は「単精度」と呼ばれることがよくあります。

于 2008-12-29T23:50:17.510 に答える
1

それらは、プロセッサの自然なサイズ (用語は不明) に関連しているため、単精度および倍精度と呼ばれます。したがって、32 ビット プロセッサの単精度は 32 ビット長になり、倍精度はその 2 倍の 64 ビット長になります。彼らは、C で単精度型を「float」と呼ぶことにしました。

于 2009-02-01T21:49:21.437 に答える
1

最も一般的な 2 つの浮動小数点形式は 32 ビットと 64 ビットを使用し、長い方は最初のサイズの「2 倍」であるため、「double」と呼ばれていました。

于 2008-12-29T23:51:31.393 に答える
1

float の「精度」の 2 倍であるため、double という名前が付けられています。実際、これが意味することは、浮動小数点値の 2 倍のスペースを使用することです。浮動小数点が 32 ビットの場合、倍精度は 64 ビットになります。

倍精度浮動小数点数の仮数の精度が 52 ビットであるのに対し、単精度浮動小数点数の仮数精度は 23 ビット (倍精度は 56) であるため、倍精度という名前は少し間違っています。浮動小数点の詳細:浮動小数点 - ウィキペディア。単精度および倍精度の浮動小数点数に関する記事へのリンクが下部に含まれています。

long double という名前は、整数型の long integer と short integer と同じ伝統に従っている可能性がありますが、この場合は「int」が「long int」と同等であるため、逆になっています。

于 2008-12-30T00:04:37.467 に答える
1

固定小数点表現では、基数の後に固定桁数があります (10 進表現における小数点の一般化)。これとは対照的に、表現されている数値の桁内で基数が移動または浮動小数点表現ができる浮動小数点表現とは対照的です。したがって、「浮動小数点表現」という名前です。これは「float」と略されました。

K&R C では、float32 ビットのバイナリ表現でdouble浮動小数点表現を参照し、64 ビットのバイナリ表現で浮動小数点表現を参照するか、サイズを 2 倍にして名前を付けました。ただし、元の K&R 仕様では、すべての浮動小数点計算を倍精度で行う必要がありました。

初期の IEEE 754 標準 (IEEE 754-1985) では、浮動小数点表現と算術演算のゴールド スタンダードであり、単精度および倍精度浮動小数点数のバイナリ表現の定義が提供されていました。倍精度数は、単精度数の 2 倍のビット数で表されるため、適切な名前でした。

浮動小数点表現の詳細については、David Goldberg の記事What Every Computer Scientist Should Know About Floating-Point Arithmetic を参照してください。

于 2008-12-30T02:17:04.890 に答える
0

したがって、float 型の %f と、double と同じ long float の %lf です。

于 2009-02-01T23:03:48.727 に答える
0

double は「倍精度」の略です。long double は、より高い精度の浮動小数点型がプロセッサに現れ始めたときに、別のキーワードを追加したくないからだと思います。

于 2008-12-29T23:52:23.230 に答える
0

doubleが の値よりも大きな値を保持できる必要はないことに注意してくださいfloat。より正確である必要があります。

于 2008-12-30T01:40:34.293 に答える
0

さて、歴史的には、以前は次のようになっていました。

C に使用されていた元のマシンでは、16 ビット ワードが 2 バイトに分割され、1 文字は 1 バイトでした。アドレスは 16 ビットだったので 2、1 でした。int も 16 ビットだったのでsizeof(foo*)2sizeof(char)でしたsizeof(int)。その後、VAX (拡張アドレッシング) マシンが登場し、アドレスは 32 ビットになりました。char は 1 バイトのままでしたsizeof(foo*)が、4 になりました。

いくつかの混乱があり、Berkeley コンパイラでは、short が 2 バイトになり、int が 4 バイトになりました。これは、効率的なコードに適しているためです。a long が 8 バイトになったのは、ダブル ワードと呼ばれる 8 バイト ブロックの効率的なアドレッシング方法があったためです。4 バイト ブロックは単語であり、2 バイト ブロックはハーフワードでした。

浮動小数点数の実装は、1 つの単語または 2 つの単語に収まるようなものでした。一貫性を保つために、ダブルワード浮動小数点数は "double" と呼ばれました。

于 2008-12-30T00:04:23.893 に答える