単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?
私は特に、ビデオゲームコンソールに関する実用的な用語に興味があります。たとえば、ニンテンドー64には64ビットプロセッサがありますか。PS3とXbox 360は、倍精度浮動小数点演算または単精度のみを引き出すことができますが、一般に、倍精度機能が利用されます(存在する場合)。
単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?
私は特に、ビデオゲームコンソールに関する実用的な用語に興味があります。たとえば、ニンテンドー64には64ビットプロセッサがありますか。PS3とXbox 360は、倍精度浮動小数点演算または単精度のみを引き出すことができますが、一般に、倍精度機能が利用されます(存在する場合)。
回答:
注:Nintendo 64には64ビットプロセッサがありますが、
多くのゲームはチップの32ビット処理モードを利用しました。64ビットデータタイプで利用できるより高いデータ精度は3Dゲームでは通常必要ないためです。64ビットデータの処理には2倍のRAMキャッシュが使用されるという事実も同様です。 、および帯域幅により、システム全体のパフォーマンスが低下します。
Webopediaから:
精度は実際には倍ではないので、倍精度という用語は誤称のようなものです。
doubleという語は、倍精度数が通常の浮動小数点数の2倍のビットを使用するという事実に由来しています。
たとえば、単精度数に32ビットが必要な場合、その倍精度数は64ビット長になります。追加のビットにより、精度だけでなく、表現できる大きさの範囲も増加します。
精度と大きさの範囲が増加する正確な量は、プログラムが浮動小数点値を表すために使用している形式によって異なります。
ほとんどのコンピューターは、IEEE浮動小数点形式と呼ばれる標準形式を使用します。
IEEE倍精度フォーマットは、実際には単精度フォーマットの2倍以上のビット数の精度と、はるかに広い範囲を持っています。
単精度
IEEE単精度浮動小数点標準表現には32ビットワードが必要です。これは、0から31までの番号が左から右に表される場合があります。
最後の23ビットは分数 'F'です。
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1 8 9 31
単語によって表される値Vは、次のように決定できます。
0<E<255
次にV=(-1)**S * 2 ** (E-127) * (1.F)
「1.Fが」暗黙リーディング1とバイナリポイントとFを付けることによって作成された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が」暗黙リーディング1とバイナリポイントとFを付けることによって作成された2進数を表すことが意図されます。V=(-1)**S * 2 ** (-1022) * (0.F)
これらは「非正規化」値です。参照:
ANSI / IEEE規格754-1985、2
進浮動小数点演算の規格。
私はたくさんの答えを読みましたが、ダブルという単語がどこから来たのかを正しく説明しているようには見えません。数年前に大学の教授から非常に良い説明があったことを覚えています。
VonCの答えのスタイルを想起し、シングルポイントの表現を浮動精度は32ビットの単語を使用しています。
表現:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
bits: 31 30 23 22 0
(ちょうど指摘しておきますが、符号ビットは最初ではなく最後です。)
二点表現をフローティング精度は、64ビットのワードを使用します。
表現:
S EEEEEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits: 63 62 52 51 0
お気づきかもしれませんが、私は仮数が両方のタイプで、その表現と比較して1つ多い情報を持っていることを書きました。実際、仮数は、意味のないすべてを除いて表された数値0
です。例えば、
つまり、仮数は常に次の形式になります。
0.α 1 α 2 ...α T ×β P
ここで、βは表現のベースです。画分は二進数であるのでしかし、α 1は常に1に等しくなり、こうして画分は1.αのように書き換えることができる2 α 3 ...α T + 1 ×2 Pと初期1は、暗黙的に仮定することができます、余分なビット(αt + 1)のためのスペースを作る。
さて、32の倍数が64であることは明らかに本当ですが、それが単語の由来ではありません。
精度は、ある桁の数を示して正しい表現エラー又は近似の任意の種類なしすなわち、。つまり、安全に使用できる10進数の数を示します。
そうは言っても、安全に使用できる10進数の数は簡単に見積もることができます。
さて、マシンでの基本的な違いは、倍精度ではシングルの2倍のビットを使用することです。通常の実装では、シングルは32ビット、ダブルは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がfloatのdoubleと呼ばれる理由です。
倍精度とは、数値を格納するのに2倍の語長が必要であることを意味します。32ビットプロセッサでは、ワードはすべて32ビットであるため、doubleは64ビットです。これがパフォーマンスの面で意味することは、倍精度数の演算は実行に少し時間がかかるということです。したがって、より良い範囲を得ることができますが、パフォーマンスにはわずかな影響があります。このヒットは、ハードウェアの浮動小数点ユニットによって少し軽減されますが、まだあります。
N64は、64ビットプロセッサであるMIPS R4300iベースのNEC VR4300を使用しましたが、プロセッサは32ビット幅のバスを介してシステムの他の部分と通信します。そのため、ほとんどの開発者は32ビットの数値を使用したのは、それらが高速であるためです。また、当時のほとんどのゲームでは、追加の精度は必要ありませんでした(したがって、倍精度ではなく浮動小数点を使用していました)。
3つのシステムはすべて、単精度および倍精度の浮動小数点演算を実行できますが、パフォーマンスが原因ではない場合があります。(ただし、n64以降のほとんどすべてが32ビットバスを使用したため...)
まず最初に、floatとdoubleは両方とも、分数の数の表現に使用されます。したがって、2つの違いは、数値を格納できる精度の高さから生じます。
たとえば、123.456789を保存する必要があります。一方は123.4567のみを保存でき、もう一方は正確な123.456789を保存できる場合があります。
したがって、基本的には、数値をどれだけ正確に格納できるかを知りたいので、これを精度と呼びます。
ここで@Alessandroを引用
精度は、正しい、つまりいかなる種類の表現誤差や近似もない10進数の桁数を示します。つまり、安全に使用できる10進数の数を示します。
Floatは小数部に約7〜8桁を正確に格納でき、Doubleは小数部に約15〜16桁を正確に格納できます。
したがって、doubleは、floatの2倍の小数部分を格納できます。それが、Doubleがdouble floatと呼ばれる理由です。
単精度数は32ビットを使用し、MSBは符号ビットですが、倍精度数は64ビットを使用し、MSBは符号ビットです
単精度
SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)
倍精度:
SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)