単精度と倍精度の浮動小数点演算の違いは何ですか?


169

単精度浮動小数点演算と倍精度浮動小数点演算の違いは何ですか?

私は特に、ビデオゲームコンソールに関する実用的な用語に興味があります。たとえば、ニンテンドー64には64ビットプロセッサがありますか。PS3とXbox 360は、倍精度浮動小数点演算または単精度のみを引き出すことができますが、一般に、倍精度機能が利用されます(存在する場合)。


17
CPUが64ビットであるという事実は、通常、CPUに64ビットの汎用レジスター(つまり整数)とメモリー・アドレス・サイズがあることを意味します。しかし、浮動小数点演算については何も述べていません。たとえば、Intel IA-32 CPUは32ビットですが、ネイティブで倍精度浮動小数点をサポートしています。
Roman Zavalov

回答:


215

注:Nintendo 64には64ビットプロセッサがありますが、

多くのゲームはチップの32ビット処理モードを利用しました。64ビットデータタイプで利用できるより高いデータ精度は3Dゲームでは通常必要ないためです。64ビットデータの処理には2倍のRAMキャッシュが使用されるという事実も同様です。 、および帯域幅により、システム全体のパフォーマンスが低下します。

Webopediaから:

精度は実際には倍ではないので、倍精度という用語は誤称のようなものです。
doubleという語は、倍精度数が通常の浮動小数点数の2倍のビットを使用するという事実に由来しています。
たとえば、単精度数に32ビットが必要な場合、その倍精度数は64ビット長になります。

追加のビットにより、精度だけでなく、表現できる大きさの範囲も増加します。
精度と大きさの範囲が増加する正確な量は、プログラムが浮動小数点値を表すために使用している形式によって異なります。
ほとんどのコンピューターは、IEEE浮動小数点形式と呼ばれる標準形式を使用します。

IEEE倍精度フォーマットは、実際には単精度フォーマットの2倍以上のビット数の精度と、はるかに広い範囲を持っています。

浮動小数点演算のIEEE標準から

単精度

IEEE単精度浮動小数点標準表現には32ビットワードが必要です。これは、0から31までの番号が左から右に表される場合があります。

  • 最初のビットは符号ビットSです。
  • 次の8ビットは指数ビット「E」であり、
  • 最後の23ビットは分数 'F'です。

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

単語によって表される値Vは、次のように決定できます。

  • E = 255でFがゼロ以外の場合、V = NaN( "Not a number")
  • E = 255でFがゼロでSが1の場合、V = -Infinity
  • E = 255でFがゼロでSが0の場合、V =無限大
  • もし0<E<255次にV=(-1)**S * 2 ** (E-127) * (1.F)「1.Fが」暗黙リーディング1とバイナリポイントとFを付けることによって作成された2進数を表すことが意図されます。
  • E = 0とFはその後、ゼロでない場合V=(-1)**S * 2 ** (-126) * (0.F)。これらは「非正規化」値です。
  • E = 0でFがゼロでSが1の場合、V = -0
  • E = 0でFがゼロで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がゼロでSが1の場合、V = -Infinity
  • E = 2047でFがゼロでSが0の場合、V =無限大
  • もし0<E<2047次にV=(-1)**S * 2 ** (E-1023) * (1.F)「1.Fが」暗黙リーディング1とバイナリポイントとFを付けることによって作成された2進数を表すことが意図されます。
  • E = 0でFがゼロ以外の場合、V=(-1)**S * 2 ** (-1022) * (0.F)これらは「非正規化」値です。
  • E = 0でFがゼロでSが1の場合、V = -0
  • E = 0でFがゼロでSが0の場合、V = 0

参照:
ANSI / IEEE規格754-1985、2
進浮動小数点演算の規格。


9
これはあなたの情報源からわかっていますが、「倍精度という用語は、精度が実際には2倍ではないため、誤称のようなものです」という文は好きではありません。シングルとダブルの精度これらの日はかなり普遍IEEEによって定義され、あなたが指摘するように、単一の精度は小数で23ビットを持っており、二重の52ビット持っている-基本的には倍精度です...
カール・ウォルシュ

5
@ZeroDivide ' **'は指数です
VonC

11
@CarlWalsh 52/23!= 2 ergo「倍の精度」ではない
rfoo


2
@rfoo徹底的に正確にしたい場合、正確に 2倍ではありませんが、52/2> 23なので、精度は2倍です。
JShorthouse、

42

私はたくさんの答えを読みましたが、ダブルという単語がどこから来たのかを正しく説明しているようには見えません。数年前に大学の教授から非常に良い説明があったことを覚えています。

VonCの答えのスタイルを想起し、シングルポイントの表現を浮動精度は32ビットの単語を使用しています。

  • 符号 1ビット、S
  • 指数「E」用の8ビット
  • 仮数、または係数とも呼ばれる小数用の24ビット(23のみが表されている場合でも)。それを「M」と呼びましょう(仮数の場合、「分数」は誤解される可能性があるため、この名前をお勧めします)。

表現:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(ちょうど指摘しておきますが、符号ビットは最初ではなく最後です。)

点表現をフローティング精度は、64ビットのワードを使用します。

  • 符号 1ビット、S
  • 指数「E」用の11ビット
  • 小数 / 仮数 / 係数の 53ビット(52のみが表示されている場合でも)、 'M'

表現:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

お気づきかもしれませんが、私は仮数が両方のタイプで、その表現と比較して1つ多い情報を持っていることを書きました。実際、仮数は、意味のないすべてを除いて表された数値0です。例えば、

  • 0.000124は0.124×10 -3になります
  • 237.141は0.237141×10 3になります

つまり、仮数は常に次の形式になります。

0.α 1 α 2 ...α T ×β P

ここで、βは表現のベースです。画分は二進数であるのでしかし、α 1は常に1に等しくなり、こうして画分は1.αのように書き換えることができる2 α 3 ...α T + 1 ×2 Pと初期1は、暗黙的に仮定することができます、余分なビット(αt + 1)のためのスペースを作る。

さて、32の倍数が64であることは明らかに本当ですが、それが単語の由来ではありません。

精度は、ある桁の数を示して正しい表現エラー又は近似の任意の種類なしすなわち、。つまり、安全に使用できる10進数の数を示します。

そうは言っても、安全に使用できる10進数の数は簡単に見積もることができます。

  • 単精度:log 10(2 24)、これは約7〜8桁の10進数
  • 倍精度:log 10(2 53)、これは約15〜16桁の10進数です

19

さて、マシンでの基本的な違いは、倍精度ではシングルの2倍のビットを使用することです。通常の実装では、シングルは32ビット、ダブルは64ビットです。

しかし、それはどういう意味ですか?IEEE標準を想定すると、単精度数の仮数は約23ビット、最大指数は約38になります。倍精度の仮数は52ビットで、最大指数は約308です。

詳細はいつものようにウィキペディアにあります。


11

ここですべての素晴らしい答えに追加するには

まず最初に、floatdoubleは両方とも、分数の数の表現に使用されます。したがって、2つの違いは、数値を格納できる精度の高さによるものです。

たとえば、 123.456789を保存する必要があります。一方は123.4567のみを保存でき、もう一方は正確な123.456789を保存できる場合があります。

したがって、基本的には、数値をどれだけ正確に格納できるかを知りたいので、これを精度と呼びます。

ここで@Alessandroを引用

精度は、正しい 10進数の数を示します。つまり、いかなる種類の表現エラーや近似もありません。つまり、安全に使用できる10進数の数を示します。

Floatは小数部に約7〜8桁を正確に格納でき、Doubleは小数部に約15〜16桁を正確に格納できます。

したがって、float は小数部分の2倍の量を格納できます。これが、Doubleがfloatのdoubleと呼ばれる理由です。


7

「ps3とxbxo 360は倍精度浮動小数点演算を実行できますか、それとも単精度のみで、一般的には倍精度機能を利用できますか(存在する場合)」。

私は両方のプラットフォームがダブル浮動小数点に対応していないと思います。元のCellプロセッサには、32ビットの浮動小数点数しかありませんでした。これは、XBox 360のベースとなっているATIハードウェア(R600)と同じです。Cellは後で2倍の浮動小数点をサポートしましたが、PS3がそのチップリを使用していないことは確かです。


5

基本的に、単精度浮動小数点演算は32ビット浮動小数点数を扱いますが、倍精度は64ビットを扱います。

倍精度のビット数は、格納できる最大値を増加させるだけでなく、精度(つまり、有効桁数)を増加させます。


5

すべてが非常に詳細に説明しており、さらに追加することはできません。レイマンの条件やわかりやすい英語で説明したいのですが

1.9 is less precise than 1.99
1.99 is less precise than 1.999
1.999 is less precise than 1.9999

.....

「1.9」を格納または表すことができる変数は、1.9999を保持または表すことができる変数よりも精度が低くなります。これらの分数は、大規模な計算では大きな違いになることがあります。


2

倍精度とは、数値を格納するのに2倍の語長が必要であることを意味します。32ビットプロセッサでは、ワードはすべて32ビットであるため、doubleは64ビットです。これがパフォーマンスの面で意味することは、倍精度数の演算は実行に少し時間がかかるということです。したがって、より良い範囲を得ることができますが、パフォーマンスにはわずかな影響があります。このヒットは、ハードウェアの浮動小数点ユニットによって少し軽減されますが、まだあります。

N64は、64ビットプロセッサであるMIPS R4300iベースのNEC VR4300を使用しました、プロセッサは32ビット幅のバスを介してシステムの他の部分と通信します。そのため、ほとんどの開発者は32ビットの数値を使用したのは、それらが高速であるためです。また、当時のほとんどのゲームでは、追加の精度は必要ありませんでした(したがって、倍精度ではなく浮動小数点を使用していました)。

3つのシステムすべて、単精度および倍精度の浮動小数点演算を実行できます、パフォーマンスが原因ではない場合があります。(ただし、n64以降のほとんどすべてが32ビットバスを使用したため...)


1

まず最初に、floatとdoubleは両方とも、分数の数の表現に使用されます。したがって、2つの違いは、数値を格納できる精度の高さから生じます。

たとえば、123.456789を保存する必要があります。一方は123.4567のみを保存でき、もう一方は正確な123.456789を保存できる場合があります。

したがって、基本的には、数値をどれだけ正確に格納できるかを知りたいので、これを精度と呼びます。

ここで@Alessandroを引用

精度は、正しい、つまりいかなる種類の表現誤差や近似もない10進数の桁数を示します。つまり、安全に使用できる10進数の数を示します。

Floatは小数部に約7〜8桁を正確に格納でき、Doubleは小数部に約15〜16桁を正確に格納できます。

したがって、doubleは、floatの2倍の小数部分を格納できます。それが、Doubleがdouble floatと呼ばれる理由です。


0

IEEE754に準拠•浮動小数点ストレージの標準•32ビットおよび64ビット標準(単精度および倍精度)•8ビットおよび11ビットの指数•中間結果の拡張形式(仮数と指数の両方)


-3

単精度数は32ビットを使用し、MSBは符号ビットですが、倍精度数は64ビットを使用し、MSBは符号ビットです

単精度

SEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

倍精度:

SEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.(SIGN+EXPONENT+SIGNIFICAND)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.