web-dev-qa-db-ja.com

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

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

私は特に、ビデオゲーム機に関連した実用的な用語に興味があります。たとえば、Nintendo 64には64ビットプロセッサが搭載されていますか。搭載されている場合、倍精度の浮動小数点演算が可能になりますか? PS3とXbox 360は、倍精度浮動小数点演算を実行できますか、単精度のみを実行できますか。一般的には、使用されている倍精度機能が使用されます(存在する場合)。

136
tweetypi

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

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

から Webopedia

精度は実際には倍精度ではないため、倍精度という用語は間違った呼び名です。
Word doubleは、倍精度数が通常の浮動小数点数の2倍のビットを使用するという事実から派生しています。
たとえば、単精度の数値に32ビットが必要な場合、対応する倍精度の数値は64​​ビット長になります。

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

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

単精度

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

  • 最初のビットはsignビット、S、
  • 次の8ビットはexponentビット、「E」、
  • 最後の23ビットはfraction 'F':

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    0 1      8 9                    31
    

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

  • E = 255でFがゼロ以外の場合、V = NaN( "Not a number")
  • E = 255でFがゼロでSが1の場合、V = -Infinity
  • E = 255でFがゼロでSが0の場合、V = Infinity
  • 0<E<255の場合、V=(-1)**S * 2 ** (E-127) * (1.F)の場合、「1.F」は、Fの前に暗黙的な先行1と2進小数点を付けて作成された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までの番号が付けられている場合があります。

  • 最初のビットはsignビット、S、
  • 次の11ビットは、exponentビット、「E」、および
  • 最後の52ビットはfraction 'F':

    S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    0 1        11 12                                                63
    

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

  • E = 2047でFがゼロ以外の場合、V = NaN( "Not a number")
  • E = 2047でFがゼロでSが1の場合、V = -Infinity
  • E = 2047でFがゼロでSが0の場合、V = Infinity
  • 0<E<2047の場合、V=(-1)**S * 2 ** (E-1023) * (1.F)の場合、「1.F」は、Fの前に暗黙の先行1と2進小数点を付けて作成された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、
バイナリ浮動小数点演算の標準。

186
VonC

私は多くの答えを読みましたが、Worddoubleがどこから来たのかを正しく説明しているものはありません。私は数年前に大学の教授から与えられた非常に良い説明を覚えています。

VonCの答えのスタイルを思い出して、single精度の浮動小数点表現は32ビットのWordを使用します。

  • sign、Sの1ビット
  • exponent、 'E'の8ビット
  • fractionの場合は24ビット、仮数または係数とも呼ばれます(23だけが表されている場合でも)。 「M」と呼びましょう(仮数の場合、「分数」は誤解される可能性があるため、この名前を好む)。

表現:

          S  EEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMM
bits:    31 30      23 22                     0

(指摘するために、符号ビットは最初ではなく最後です。)

double精度の浮動小数点表現は、64ビットのワードを使用します。

  • sign、Sの1ビット
  • exponent、 'E'の11ビット
  • 分数/仮数/係数の53ビット(52のみが表されている場合でも)、 'M'

表現:

           S  EEEEEEEEEEE   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
bits:     63 62         52 51                                                  0

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

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

これは、仮数が常に次の形式になることを意味します

0.α1α2...αt ×βp

ここで、βは表現のベースです。しかし、分数は2進数なので、α1 常に1に等しいため、分数は1.αに書き換えることができます。2α3...αt + 1 ×2p また、最初の1は暗黙的に想定され、余分なビット(αt + 1)。

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

precisionは、正しいである10進数の桁数を示します。つまり、表現エラーや近似はありません。言い換えれば、安全に使用できる小数点以下の桁数を示します。

とはいえ、安全に使用できる10進数の桁数は簡単に推定できます。

  • 単精度:ログ10(224)、これは約7〜8桁の10進数です
  • 倍精度:ログ10(253)、約15〜16桁の10進数です
27
Alessandro

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

しかし、それは何meanを意味しますか? IEEE規格を想定すると、単精度の数値には仮数部が約23ビット、最大指数が約38ビットあります。倍精度には、仮数用に52ビット、最大約308の指数があります。

詳細は通常通り Wikipedia にあります。

16
Charlie Martin

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

まず、floatdoubleは、両方とも小数の表現に使用されます。したがって、2つの違いは、数値をどれだけ正確に格納できるかという事実に由来しています。

例:123.456789を保存する必要がある場合、一方は123.4567のみを保存でき、他方は正確な123.456789を保存できる場合があります。

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

ここで@Alessandroを引用

精度は、correctである10進数の桁数を示します。つまり、表現エラーや近似はありません。言い換えると、安全に使用できる小数点以下の桁数を示します。

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

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

8
SimpleGuy

「ps3およびxbxo 360は、倍精度浮動小数点演算を実行できますか、単精度のみで一般的に使用できますか(存在する場合)。

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

6
codekaizen

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

倍精度のビット数により、格納できる最大値が増加し、精度(有効桁数)が増加します。

4
cletus

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

N64は、64ビットプロセッサであるMIPS R4300iベースのNEC VR4300を使用しました。butプロセッサは、 32ビット幅のバス上のシステム。そのため、ほとんどの開発者は32ビットの数値を使用しました。これは、それらが高速であり、当時のほとんどのゲームが追加の精度を必要としなかったためです。

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

1
Alex

まず、floatとdoubleは両方とも小数の表現に使用されます。したがって、2つの違いは、数値をどれだけ正確に格納できるかという事実に由来しています。

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

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

ここで@Alessandroを引用

精度は、正しい、つまり、あらゆる種類の表現エラーや近似のない10進数の桁数を示します。つまり、安全に使用できる小数点以下の桁数を示します。

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

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

0
djb7861

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

0