4

C と Java では、float の基になる表現は IEEE754-32、double は IEEE754-64 です。

式でfloatは、 に自動昇格されdoubleます。では、どうやって?例として 3.7f を取り上げます。プロセスはこのようなものですか?

  1. 3.7f は、IEEE754 を使用してメモリ内で表現されます。4 バイトに収まります。
  2. 計算中に、3.7f を IEEE754-64 表現に変換して、64 ビット レジスタ (または任意の 64 ビット プレース) にロードすることができます。
4

2 に答える 2

5

これは実装に大きく依存します。

一例として、x86 プラットフォームでは、一連の FPU コマンドには、IEEE754floatおよびdoubleフォーマット (および他の多くのフォーマット) でデータをロード/保存するためのコマンドが含まれています。データは、80 ビット幅の内部 FPU レジスタにロードされます。そのため、実際には x86 ではすべての浮動小数点計算が 80 ビットの浮動小数点精度で実行されます。つまり、すべての浮動小数点データは、実際には 80 ビットの精度に昇格されます。とにかく直接観察することはできないため、これらのレジスタ内でデータがどのように表現されるかはまったく関係ありません。

これは、x86 プラットフォームでは、float から double への単一ステップの変換などがないことを意味します。このような変換が必要になると、実際には float から internal-fpu への変換と internal-fpu から double への変換の 2 段階の変換として実装されます。

この BTW により、x86 FPU 計算モデルと C/C++ 計算モデルの間に意味上の大きな違いが生じました。言語モデルに完全に一致させるために、プロセッサは中間浮動小数点の結果の精度を強制的に下げる必要があり、パフォーマンスに悪影響を及ぼします。多くのコンパイラは、FPU 計算モデルを制御するオプションをユーザーに提供し、ユーザーが厳密な C/C++ 準拠、より優れたパフォーマンス、またはその中間を選択できるようにします。

少し前まで、FPU ユニットはx86 プラットフォームのオプションコンポーネントでした。FPU を使用しないプラットフォームでの浮動小数点計算は、FPU をエミュレートするか、FPU 命令をまったく使用せずにコードを生成することによって、ソフトウェアで実行されました。このような実装では、たとえば、IEEE754 から IEEE754floatへのソフトウェア変換をdouble直接実行するなど、動作が異なる可能性があります。

于 2012-08-25T03:00:35.693 に答える
0

C/Java では、浮動小数点数の基になる表現は IEEE754-32 であり、二重小数点は IEEE754-64 です。

違う。C 標準では、型間の関係は保証されていましたが、整数型と浮動小数点型のサイズに一定の特定の制限を指定したことはありません。

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
sizeof(float) <= sizeof(double) <= sizeof(long double)

C 実装では、現在ほとんどが IEEE-754 とその子孫を使用していますが、任意のタイプの浮動小数点形式を使用できます。同様に、1 の補数や符号の大きさなどの整数表現を自由に使用できます。

昇格規則について、C の標準化前のバージョンでは式の float を double に昇格させていましたが、C89/90 では規則が変更され、float * float結果が返されfloatます。

If either operand has type long double, the other operand is converted to long double
Otherwise, if either operand is double, the other operand is converted to double.
Otherwise, if either operand is float, the other operand is converted to float.

C++ 演算子の暗黙的な型変換規則

ただし、仮想マシンでバイトコードを実行し、VM の型がプラットフォーム間で一貫しているため、Java や C# では当てはまります。

于 2013-12-19T14:42:15.953 に答える