単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?
-
03-07-2019 - |
質問
単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?
私はビデオゲーム機に関連した実践的な用語に特に興味があります。たとえば、Nintendo 64 には 64 ビット プロセッサが搭載されていますか? もし搭載されている場合、それは倍精度浮動小数点演算が可能であったことを意味しますか?PS3 と Xbox 360 は倍精度浮動小数点演算を実行できますか、それとも単精度のみを実行できます。一般に使用されるのは倍精度機能です (存在する場合)。
解決
注記:の ニンテンドー64 ただし、64 ビット プロセッサは搭載されています。
多くのゲームはチップの 32 ビット処理モードを利用しました。64 ビット データ型で利用できるより高いデータ精度は通常 3D ゲームでは必要ありません。また、64 ビット データの処理では 2 倍の RAM、キャッシュを使用するという事実からです。 、帯域幅が減少するため、システム全体のパフォーマンスが低下します。
から ウェペディア:
精度が実際には 2 倍ではないため、倍精度という用語は誤った呼び名です。
double という言葉は、倍精度数値が通常の浮動小数点数の 2 倍のビットを使用するという事実に由来しています。
たとえば、単精度数値に 32 ビットが必要な場合、対応する倍精度数値は 64 ビット長になります。追加のビットにより、精度が向上するだけでなく、表現できる大きさの範囲も広がります。
精度と大きさの範囲がどれだけ増加するかは、プログラムが浮動小数点値を表すためにどのような形式を使用しているかによって異なります。
ほとんどのコンピュータは、IEEE 浮動小数点形式として知られる標準形式を使用します。
単精度
IEEE 単精度浮動小数点標準表現には 32 ビット ワードが必要で、左から右に 0 ~ 31 の番号を付けて表現できます。
- 最初のビットは、 サイン ビット、S、
- 次の 8 ビットは 指数 ビット、「E」、および
最後の 23 ビットは 分数 「F」:
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF 0 1 8 9 31
単語によって表される値 V は次のように決定できます。
- E=255 で F がゼロ以外の場合、V=NaN (「数値ではない」)
- E=255、F が 0、S が 1 の場合、V=-Infinity
- E=255、F がゼロ、S が 0 の場合、V=無限大
- もし
0<E<255
それからV=(-1)**S * 2 ** (E-127) * (1.F)
ここで、「1.F」とは、fをfixにして暗黙のリーディング1およびバイナリポイントを使用して作成することで作成されたバイナリ番号を表すことを目的としています。 - E=0 で F がゼロ以外の場合、
V=(-1)**S * 2 ** (-126) * (0.F)
. 。これらは「非正規化」値です。 - E=0、F が 0、S が 1 の場合、V=-0
- E=0、F が 0、S が 0 の場合、V=0
特に、
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 の番号を付けて表現できます。
- 最初のビットは、 サイン ビット、S、
- 次の 11 ビットは 指数 ビット、「E」、および
最後の 52 ビットは 分数 「F」:
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 0 1 11 12 63
単語によって表される値 V は次のように決定できます。
- E=2047 で F がゼロ以外の場合、V=NaN (「数値ではない」)
- E=2047、F が 0、S が 1 の場合、V=-Infinity
- E=2047、F がゼロ、S が 0 の場合、V=無限大
- もし
0<E<2047
それからV=(-1)**S * 2 ** (E-1023) * (1.F)
ここで、「1.F」とは、fをfixにして暗黙のリーディング1およびバイナリポイントを使用して作成することで作成されたバイナリ番号を表すことを目的としています。 - E=0 で F がゼロ以外の場合、
V=(-1)**S * 2 ** (-1022) * (0.F)
これらは「非正規化」値です。 - E=0、F が 0、S が 1 の場合、V=-0
- E=0、F が 0、S が 0 の場合、V=0
参照:
ANSI/IEEE 規格 754-1985、
2 進浮動小数点演算の標準。
他のヒント
多くの回答を読みましたが、 double という単語の由来を正しく説明しているものはありません。数年前に大学の教授から与えられた非常に良い説明を覚えています。
VonCの答えのスタイルを思い出して、単一の精度の浮動小数点表現は32ビットの単語を使用します。
- 記号の1ビット、S
- 8ビットの指数、「E」
- fraction の24ビット。仮数、または係数とも呼ばれます(23だけが表されていても)。 「M」と呼びましょう(仮数の場合、この名前は<!> quot; fraction <!> quot;と誤解される可能性があります)。
表現:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
bits: 31 30 23 22 0
(指摘するために、符号ビットは最初ではなく最後です。)
double 精度の浮動小数点表現では、64ビットのワードを使用します。
- 記号の1ビット、S
- 指数、 'E' の11ビット
- 小数部 / 仮数部 / 係数の53ビット(52のみが表されている場合でも)、「M」
表現:
S EEEEEEEEEEE MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits: 63 62 52 51 0
お気づきかもしれませんが、仮数は両方のタイプで、その表現と比較してもう少し情報があると書きました。実際、仮数は、すべての非有意0
なしで表される数値です。たとえば、
- 0.000124は0.124になります<!>#215; 10 <!>#8722; 3
- 237.141は0.237141 <!>#215になります。 10 3
これは、仮数が常に次の形式になることを意味します
0。<!>#945; 1 <!>#945; 2 ... <!>#945; t <!>#215; <!>#946; p
where <!>#946;表現のベースです。ただし、小数部は2進数であるため、<!>#945; 1 は常に1に等しくなります。したがって、小数部は1。<!>#945; 2 <!>#945; 3 ... <!>#945; t + 1 <!>#215; 2 p および最初の1を暗黙的に想定して、余分なビット(<!>#945; t + 1 )のスペースを空けることができます。
今では、32の倍数が64であることは明らかですが、それは単語の由来ではありません。
精度は、正しいである、つまり、いかなる種類の表現エラーや近似もない10進数の桁数を示します。つまり、安全に使用できる小数点以下の桁数を示します。
とはいえ、安全に使用できる10進数の桁数は簡単に推定できます。
- 単精度:log 10 (2 24 )、これは約7〜8桁の10進数です
- 倍精度:log 10 (2 53 )、これは約15〜16桁の10進数です
さて、マシンでの基本的な違いは、倍精度はシングルの2倍のビットを使用することです。通常の実装では、シングルでは32ビット、ダブルでは64ビットです。
しかし、それは とはどういう意味ですか? IEEE規格を想定すると、単精度の数値には仮数部が約23ビット、最大指数が約38ビットあります。倍精度には、仮数に52ビット、最大約308の指数があります。
詳細は、通常どおり Wikipedia にあります。
ここにすべての素晴らしい答えを追加するには
まず、 float と double は、両方とも小数の表現に使用されます。したがって、2つの違いは、数値をどれだけ正確に格納できるかという事実に由来しています。
例: 123.456789を保存しなければなりません。一方は123.4567しか保存できませんが、もう一方は正確な123.456789を保存できます。
したがって、基本的に、数値をどれだけ正確に格納でき、これを精度と呼んでいます。
ここで@Alessandroを引用
精度は、正しいである小数点以下の桁数を示します。 つまり、表現エラーや近似は一切ありません。に つまり、安全に使用できる小数点以下の桁数を示します。
Floatは、小数部に約7〜8桁を正確に格納できますが、 Doubleでは、小数部分に約15〜16桁を正確に格納できます
したがって、floatは小数部の2倍の量を格納できます。そのため、Doubleは double the float
と呼ばれます。質問について<!> quot; ps3およびxbxo 360は、倍精度浮動小数点演算または単精度のみを実行できますか? > quot;
両方のプラットフォームが二重浮動小数点に対応していないと思います。元のCellプロセッサには32ビットのフロートしかありませんでした。XBox360のベースとなっているATIハードウェア(R600)と同じです。 Cellは後で2つの浮動小数点をサポートしましたが、PS3はそのチップを使用しないと確信しています。
倍精度とは、数値の格納にワード長の2倍の時間がかかることを意味します。 32ビットプロセッサでは、ワードはすべて32ビットなので、doubleは64ビットです。これがパフォーマンスの観点から意味することは、倍精度の数値に対する演算の実行に少し時間がかかることです。したがって、より良い範囲を取得できますが、パフォーマンスにわずかな影響があります。このヒットは、ハードウェアの浮動小数点ユニットによって少し緩和されますが、それでもあります。
N64は64ビットプロセッサであるMIPS R4300iベースのNEC VR4300を使用しましたが、プロセッサは32ビット幅のバスを介してシステムの他の部分と通信します。 そのため、ほとんどの開発者は32ビットの数値を使用しました。これは、それらが高速であり、当時のほとんどのゲームが追加の精度を必要としなかったためです(したがって、倍精度ではなく浮動小数点を使用しました)。
3つのシステムはすべて、単精度および倍精度の浮動演算を できますが、パフォーマンスのためではない可能性があります。 (ただし、n64が32ビットバスを使用した後のほとんどすべてが...)
IEEE754によると <!>#8226;浮動小数点ストレージの標準 <!>#8226; 32ビットおよび64ビット標準(単精度および倍精度) <!>#8226;それぞれ8および11ビットの指数 <!>#8226;中間結果のための拡張形式(仮数と指数の両方)
まず、floatとdoubleは両方とも小数の表現に使用されます。したがって、2つの違いは、数値をどれだけ正確に格納できるかという事実に起因しています。
例:123.456789を保存する必要がある場合は、1つは123.4567のみを保存できますが、もう1つは正確な123.456789を保存できます。
したがって、基本的には、数値をどれだけ正確に格納でき、これを精度と呼んでいます。
ここで@Alessandroを引用
精度は、正しい、つまり、いかなる種類の表現エラーや近似もない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)