最も一般的な整数が32ビットであるのに、最も一般的な浮動小数点数が64ビットであるのはなぜですか?

JavaとC#のバックグラウンドから来て、私はいつでもint(32ビット)を使用することを学びました。整数が必要であり、小数値を処理する場合はdouble(64ビット)が必要です。それぞれのフレームワーク(JVMおよび.NET)のほとんどのメソッドは、通常、これら2つのタイプを想定しています。

私の質問は、一貫性を保つためにlongdoubleの両方を使用しないのはなぜですか。整数で64ビットの精度を持つことはほとんどの場合必要ないことを私は知っていますが、繰り返しになりますが、浮動小数点数で64ビットの精度は通常必要ありませんか?

この背後にある理由はありますか?

コメント

  • "フロートのように見えるかもしれません誰もが合理的に必要とするものには十分ですが、'ではありません…実際には、10進数の15桁の64ビットdoubleは'多くのアプリケーションには十分ではありません… "(なぜfloat / doubleが必要なのですか?
  • Cのバックグラウンドから来て、'は、浮動小数点数にBigDecimalを使用することを学びました。これは、丸めとFP値の比較は非常に問題があります。
  • @TMN I ' 1/3を計算しようとしたときにスローされる型がすべての解決策であるかどうかはわかりません。

A nswer

範囲と精度

1つは、最も一般的な浮動小数点数が64ビットDPFP(倍精度浮動小数点)表現を使用するという考えに異議を唱えることです。

少なくともパフォーマンスが重要な現実では-ゲームのような時間フィールドでは、SPFP(単精度浮動小数点)がさらに一般的です。これは、近似と速度が最高の精度よりも望ましいためです。

これを確認する1つの方法は、32ビットです。 -ビットintは、2^32整数の範囲(約43億)を表します。整数の最も一般的な使用法は、おそらく要素へのインデックスとしてであり、「今日のハードウェアで利用可能なメモリを超えずに超えることは困難な、かなり健全な要素の範囲です」*。

* 30ギガバイトの空きがある場合でも、単一の連続する4ギガバイトのブロックを割り当て/アクセスすると、メモリ不足エラーが発生する可能性があることに注意してください。そのブロックの要件。

32ビット整数は、命令レベルで常に効率的であるとは限りませんが、配列に集約すると、たとえばメモリの半分が必要になるため(たとえば、単一のページ/キャッシュ行に収まるインデックスが増えるため)、一般的に効率が高くなる傾向があります。

また、

が指摘しているように、32ビット整数がより一般的に使用されているということは、広い観点からは必ずしも真実ではありません。私の狭い視野は、32ビットのintsが別の構造へのインデックスとして数十万から数百万単位で集約されることが多い分野から来ています。サイズを半分にすると、

現在、64ビットDPFPは、状況によっては64ビット整数よりもはるかに多く使用される可能性があります。 余分なビットは、範囲ではなく精度を追加しています。多くのアプリケーションは精度を要求する可能性があります。または、少なくとも、特別な精度を利用してプログラミングを行うのがはるかに簡単です。そのため、一部の地域では64ビットDPFPが64ビット整数よりも 一般的である可能性があり、intが依然として32ビットである可能性があるのはそのためです。多くのシナリオでは、64ビットプラットフォームでも可能です。

コメント

  • ' dはアイデアに異議を唱えます最も一般的な整数データタイプも32ビット幅であり、少なくとも今日の商用ハードウェアで記述されたプログラムでは、64ビットプラットフォームが非常に普及しています。
  • @I ke:多くのソフトウェアは、範囲を気にせずにintlongを使用していると思われます…そして、そのようなソフトウェアは、今日ではどちらの場合も主に64ビット整数を使用していると思います。
  • うーん、私は正直です。どうやらintは一般的にまだ32ビットです。 、主にその種のコードにバグが発生するのを避けるためです。'まだsize_tと。
  • @LightnessRacesinOrbitなるほど、私は'非常に偏っています。これは、整数をデータ構造に集約するコードベースで作業することが多く、合計メモリサイズを懸念しているためです。私は自分の答えをできるだけ中立にしようとしました。
  • @I ke:個人的にはすべてのタイプを明示的なサイズにします。しかし、あなたと私は間違いなく異常です。 🙂

回答

まあ、intとdoubleはJavaのものです。たとえば、Objective-CとSwiftでは、NSIntegerまたはIntを使用します。これは、32ビットマシンでは32ビット、64ビットマシンでは64ビットです。メモリ内にある可能性のあるアイテムをいくつでも数えるのに十分な大きさ。間違いなく役立つのは、特定の状況で何か他のものが必要でない限り、ほとんどどこでも同じタイプを使用することです。

Javaは、どの実装でも同じように実行されるコードを作成しようとするため、使用しているマシンに関係なく同じタイプを使用する必要があり、タイプは独立して同じビット数を持つ必要があると考えています。この機械。 Objective-CとSwift(およびC、C ++も)は異なる視点を持っています。

整数は主に物を数えるために使用され、通常は数えるものはそれほど多くありません。浮動小数点演算には精度が必要であり、32ビット浮動小数点では十分な精度が得られないことがよくあります。どこでも64ビットdoubleを使用すると、浮動小数点演算の専門家でなくても、常に十分な精度を得ることができます。 floatはそうではありません。

しかし、longとdoubleを使用すると、どのような一貫性が得られますか?整数と浮動小数点数は同じものではありません。一貫したビットサイズである必要はありません。2Dポイントを使用します。一貫性を保つために、それらも64ビットにする必要がありますか?コンポーネントごとに32ビットのポイントと16ビットの長方形ですか?もちろんそうではありません。一貫性は必要ありません。

コメント

  • これは、プラットフォームに関係なく各タイプのサイズを同じに保つというJVM側を説明する非常に良い答えです。

回答

short、int、single、doubleは、32ビットおよび64ビットプラットフォーム用の最も一般的なCコンパイラおよびjavaのようなCと同じサイズです。 intを主な整数型、doubleを主な浮動小数点型と明確に見なしています。Javaは当時の一般的なCコンパイラからこの規則を継承したと言っても過言ではありません。

通常、整数はcに使用20億を超えるものを数えたり、索引を付けたりする必要があることは(前代未聞ではありませんが)非常にまれです。実際、C99より前は、64ビット整数が必要な場合はベンダー固有の型を使用する必要がありました。

浮動小数点数は通常、実数の近似値として使用されます。多くの場合、単精度で十分ですが、許容できない量の丸め誤差が発生する問題を見つけるのは難しくありません。64ビットよりずっと前に、倍精度浮動小数点サポートが普及したのは、科学コンピューティングからの需要であると思います。整数のサポートがありました。

Cが倍精度の使用を推奨しているのに対し、fortranは単精度の使用を推奨しているようです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です