質問

さまざまなデータ型のサイズが、自分が使用しているシステムに応じて変更できることを知っています。 XP 32bitsを使用しており、C ++でsizeof()演算子を使用しています。長いダブルは12バイトで、ダブルは8であるようです。

ただし、ほとんどの主要な情報源は、長いダブルは8バイトであるため、範囲はダブルと同じであると述べています。

どうして私は12バイトを持っていますか?長いダブルが実際に12バイトである場合、これは値の範囲も拡張しませんか?または、値がダブルの範囲を超えている場合にのみ長い署名(コンパイラ図)が使用され、したがって8バイトを超えていますか?

ありがとうございました。

役に立ちましたか?

解決

から引用 ウィキペディア:

X86アーキテクチャでは、ほとんどのコンパイラは、そのハードウェアでサポートされている80ビットの拡張精度タイプとして長い2倍に実装しています(データ構造を維持するために12または16バイトとして保存される場合があります。

コンパイラは、現在ソフトウェアに実装されている128ビットの四重精度形式にLong Doubleを使用することもできます。

言い換えれば、はい、a long double 五月 より広い範囲の値を保存できる double. 。しかし、それは完全にコンパイラ次第です。

他のヒント

X64の最新のコンパイラの場合、ClangとGCCは16バイトのダブルを使用します long double 一方、VC ++は8バイトのダブルを使用します。言い換えれば、ClangとGCCを使用すると、VC ++の場合はより高い精度のダブルが得られます long double と同じです double. 。最新のX86 CPUはこれらの16バイトのダブルをサポートしているため、ClangとGCCは正しいことをしていると思います。

数値の標準バイトサイズは、すべてのプラットフォームで保証された最小サイズです。一部のシステムでは大きい場合がありますが、決して小さくなることはありません。

私のプログラミングの初心者エクスペリエンスに関する限り、

  • 定期的な正規化されたフロートを使用[-1.0、+1.0

  • ダブル、またはロングダブルで正規化値を個別に保持します

  • 正規化はノイズを導入します=小さなエラー=変数値への高周波数

  • 時々、平均値を個別に保持し、データをソートしたままにしておくと正規化すると便利です(元のデータ順序は順列ベクトルとして保存できます)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top