単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?
私は、ビデオ ゲーム コンソールに関連する実用的な用語に特に興味があります。たとえば、Nintendo 64 には 64 ビット プロセッサが搭載されていますか?搭載されている場合、それは倍精度浮動小数点演算が可能だったことを意味しますか? PS3 と Xbox 360 は、倍精度の浮動小数点演算を実行することも、単精度のみを実行することもできます。また、一般的に使用されるのは倍精度機能です (存在する場合)。
単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?
私は、ビデオ ゲーム コンソールに関連する実用的な用語に特に興味があります。たとえば、Nintendo 64 には 64 ビット プロセッサが搭載されていますか?搭載されている場合、それは倍精度浮動小数点演算が可能だったことを意味しますか? PS3 と Xbox 360 は、倍精度の浮動小数点演算を実行することも、単精度のみを実行することもできます。また、一般的に使用されるのは倍精度機能です (存在する場合)。
注: Nintendo 64には 64 ビット プロセッサが搭載されていますが、
多くのゲームはチップの 32 ビット処理モードを利用しました。これは、64 ビット データ型で利用可能なより高いデータ精度が 3D ゲームでは通常必要とされないためであり、64 ビット データの処理には 2 倍の RAM、キャッシュ、および帯域幅が原因で、システム全体のパフォーマンスが低下します。
ウェブペディアから:
倍精度という用語は、精度が実際には 2 倍ではないため、誤称のようなものです。
double という単語は、倍精度数が通常の浮動小数点数の 2 倍のビットを使用するという事実に由来します。
たとえば、単精度数に 32 ビットが必要な場合、対応する倍精度数は 64 ビットになります。余分なビットは、精度だけでなく、表現できる大きさの範囲も増加させます。
精度と大きさの範囲が増加する正確な量は、プログラムが浮動小数点値を表すために使用している形式によって異なります。
ほとんどのコンピューターは、IEEE 浮動小数点形式と呼ばれる標準形式を使用します。
実際には、IEEE 倍精度形式は、単精度形式の 2 倍以上の精度のビット数と、はるかに広い範囲を持っています。
浮動小数点演算の IEEE 標準から
単精度
IEEE 単精度浮動小数点標準表現には、左から右に 0 から 31 までの番号が付けられた 32 ビット ワードが必要です。
最後の 23 ビットは分数'F' です。
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31
単語によって表される値 V は、次のように決定できます。
0<E<255
、V=(-1)**S * 2 ** (E-127) * (1.F)
「1.F」は、F の前に暗黙の 1 と 2 進小数点を付けることによって作成される 2 進数を表すことを意図しています。V=(-1)**S * 2 ** (-126) * (0.F)
. これらは「正規化されていない」値です。特に、
0 00000000 00000000000000000000000 = 0
1 00000000 00000000000000000000000 = -0
0 11111111 00000000000000000000000 = Infinity
1 11111111 00000000000000000000000 = -Infinity
0 11111111 00000100000000000000000 = NaN
1 11111111 00100010001001010101010 = NaN
0 10000000 00000000000000000000000 = +1 * 2**(128-127) * 1.0 = 2
0 10000001 10100000000000000000000 = +1 * 2**(129-127) * 1.101 = 6.5
1 10000001 10100000000000000000000 = -1 * 2**(129-127) * 1.101 = -6.5
0 00000001 00000000000000000000000 = +1 * 2**(1-127) * 1.0 = 2**(-126)
0 00000000 10000000000000000000000 = +1 * 2**(-126) * 0.1 = 2**(-127)
0 00000000 00000000000000000000001 = +1 * 2**(-126) *
0.00000000000000000000001 =
2**(-149) (Smallest positive value)
倍精度
IEEE 倍精度浮動小数点標準表現には 64 ビット ワードが必要であり、左から右に 0 から 63 までの番号で表すことができます。
最後の 52 ビットは分数'F' です。
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0 1 11 12 63
単語によって表される値 V は、次のように決定できます。
0<E<2047
、V=(-1)**S * 2 ** (E-1023) * (1.F)
「1.F」は、F の前に暗黙の 1 と 2 進小数点を付けることによって作成される 2 進数を表すことを意図しています。V=(-1)**S * 2 ** (-1022) * (0.F)
これらは「正規化されていない」値です。参照:
ANSI/IEEE 標準 754-1985、
バイナリ浮動小数点演算の標準。
わかりました、マシンでの基本的な違いは、倍精度は単精度の 2 倍のビットを使用することです。通常の実装では、single の場合は 32 ビット、double の場合は 64 ビットです。
しかし、それはどういう意味ですか?IEEE 標準を想定すると、単精度数の仮数は約 23 ビットで、最大指数は約 38 です。倍精度の仮数部は 52 ビットで、最大指数は約 308 です。
詳細はいつものようにウィキペディアにあります。
ここにすべての素晴らしい答えを追加するには
まず第一に、floatとdoubleはどちらも小数の表現に使用されます。したがって、2 つの違いは、数値を格納できる精度が高いという事実に由来します。
たとえば、 123.456789 を保存する必要がある場合、123.4567 のみを保存できる人もいれば、正確な 123.456789 を保存できる人もいます。
したがって、基本的には、数値をどれだけ正確に格納できるかを知りたいのです。これを精度と呼びます。
ここで@Alessandroを引用
精度は、正確な10 進数の桁数を示します。つまり、いかなる種類の表現エラーや近似もありません。つまり、安全に使用できる 10 進数の桁数を示します。
Float は小数部に約 7 ~ 8 桁を正確に格納でき、Double は小数部に約 15 ~ 16 桁を正確に格納できます。
したがって、floatは小数部分の 2 倍の量を格納できます。そのため、Double はdouble the floatと呼ばれます
質問に関しては、「ps3 と xbxo 360 は倍精度浮動小数点演算または単精度のみを実行できますか。一般的に使用されるのは倍精度機能です (存在する場合)。」
どちらのプラットフォームも double 浮動小数点を使用できないと思います。XBox 360 のベースとなっている ATI ハードウェア (R600) と同じように、元の Cell プロセッサには 32 ビット浮動小数点しかありませんでした。セルは後で二重浮動小数点をサポートしましたが、PS3 がそのチッペリーを使用していないことは確かです。
倍精度とは、数値を格納するのに 2 倍の語長が必要であることを意味します。32 ビット プロセッサでは、ワードはすべて 32 ビットであるため、double は 64 ビットです。パフォーマンスの観点からこれが意味することは、倍精度数の演算の実行に少し時間がかかるということです。そのため、より良い範囲が得られますが、パフォーマンスにはわずかな影響があります. このヒットは、ハードウェアの浮動小数点ユニットによって少し軽減されますが、まだ残っています。
N64 は 64 ビット プロセッサである MIPS R4300i ベースの NEC VR4300 を使用しましたが、プロセッサは 32 ビット幅のバスを介してシステムの残りの部分と通信します。したがって、ほとんどの開発者はより高速な 32 ビットの数値を使用し、当時のほとんどのゲームでは追加の精度を必要としませんでした (そのため、double ではなく float を使用していました)。
3 つのシステムはすべて、単精度および倍精度の浮動小数点演算を実行できますが、パフォーマンスが原因で実行できない場合があります。(ただし、n64以降のほとんどすべてが32ビットバスを使用していたため...)
単精度数は 32 ビットを使用し、MSB は符号ビットですが、倍精度数は 64 ビットを使用し、MSB は符号ビットです。
単精度
SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)
倍精度:
SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)