web-dev-qa-db-ja.com

ロングダブルvsダブル

さまざまなデータ型のサイズは、使用しているシステムに応じて変わる可能性があることを知っています。 XP 32bitsを使用し、C++でsizeof()演算子を使用すると、long doubleは12バイト、doubleは8であるようです。

ただし、ほとんどの主要なソースでは、long doubleは8バイトであるため、範囲はdoubleと同じです。

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

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

59
CppLearner

Wikipedia からの引用:

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

そして

コンパイラーは、現在ソフトウェアに実装されている128ビットの4倍精度形式にlong doubleを使用する場合もあります。

つまり、はい、long doubleは、doubleよりも広い範囲の値を格納できます。しかし、それは完全にコンパイラ次第です。

59
Borealid

X64上の最新のコンパイラでは、ClangとGCCはlong doubleに16バイトdoubleを使用し、VC++は8バイトdoubleを使用します。言い換えれば、ClangとGCCでは、より高い精度の倍精度が得られますが、VC++ではlong doubledoubleと同じです。最新のx86 CPUはこれらの16バイトの倍精度をサポートしているため、ClangとGCCは正しいことをしており、高レベルの言語プリミティブを使用して低レベルのハードウェア機能にアクセスできると思います。

5
Shital Shah

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

3
scott77777

私のプログラミング初心者の経験がプロンプトする限り:

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

  • Doubleまたはlong doubleで個別に正規化値を保持します

  • 正規化により、変数値にノイズ=小さなエラー=高周波が導入されます

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

0
Piotr Lenarczyk