固定サイズの浮動小数点型


90

stdint.h(C99)、ブースト/ cstdint.hpp、及びcstdint(C ++ 0X)ヘッダタイプは、とりわけ、ありますint32_t

同様の固定サイズの浮動小数点型はありますか?のようなものfloat32_t


4
なぜそんなものが必要なのですか?
AraK

39
浮動小数点値を持つデータ構造があり、そのサイズを正確に知りたい場合にも、そのようなものが必要です。
mob

5
@mobrule:サイズを知る必要がある場合は、sizeof演算子を使用します。このようなタイプは、アルゴリズムが既知の特定のサイズであることを要求する場合に役立ちます。
スティーブンキャノン

6
@Stephen Canon-はい、サイズを保証したい場合に。たとえば、データ構造のインスタンスが64ビットに収まり、値によって外部ライブラリに渡すことができるとします。
mob

5
@StephenCanonクロスプラットフォームのシリアル化ライブラリを検討してください。sizeof浮動型のマーシャリングとアンマーシャリングを一貫して行うという問題を解決するには、どうすればよいですか?
カイルストランド

回答:


47

現在、このようなものはCまたはC ++標準には存在しません。実際、float2進浮動小数点形式になる保証はまったくありません。

一部のコンパイラは、floatタイプがIEEE-754 32ビットバイナリ形式であることを保証します。一部ではありません。実際にfloatは、ほとんどの非組み込みプラットフォームのIEEE-754 singleタイプですが、より広い形式の式を評価する一部のコンパイラーに関する通常の警告が適用されます。

IEEE-754の2008改訂版のC言語バインディングの追加について議論するワーキンググループがあり、そのようなtypedefを追加することを推奨することを検討できます。これがCに追加された場合、C ++標準がそれに追随すると思います...最終的には。


3
IEEE-754に関係なく、エンディアンの移植性の問題を防ぐことはできません。
マークB

1
@Pietro:言語を変更しても、ハードウェアの互換性に影響はありません。一部のハードウェアがコンプライアンスから除外されるだけです。IEEE FPは移植性をどのように保証しますか?
Potatoswatter 2010年

1
@Potatoswatter:ハードウェアベンダーが準拠ソリューションを提供することを奨励します。パートaがソフトフロートライブラリハックを必要とせずに標準Cをサポートし、パートbがサポートしない場合、それはパートaの市場での利点です。
スティーブンキャノン

2
@Potatoswatter:(ほとんど)ハードウェアの速度を気にする人はいません。ハードウェアで実行されるソフトウェアの速度に関心があります。ソフトウェアは、それが実行されているハードウェアが標準に準拠しており、ソフトウェアが実行されているプラ​​ットフォームに応じて、15の異なる特殊なケースを検出してパッチを適用する必要がない場合、より高速になります。
スティーブンキャノン

8
コードが多数のニッチなアーキテクチャーでコンパイルされるのを防ぐことで、どのようにして移植性を向上させますか?フロートがIEEEであることに依存している場合、コードはすでにすべてのIEEE準拠の実装で実行され、他には何も実行されないか、そうではない場合、コードはより幅広いシステムで実行されます。C ++の場合は保証 IEEEのコンプライアンスを、魔法よりポータブル得ないでしょう、あなたのコードでは、あなたはそれができることを除外したいこれまで、これらの非準拠のアーキテクチャ上で動作します。あなたの論理は完全に逆です。
2010年

29

floatIEEE 32ビットタイプかどうかを知りたい場合は、を確認してくださいstd::numeric_limits<float>::is_iec559。これはコンパイル時の定数であり、関数ではありません。

より完全なものにしたい場合はstd::numeric_limits<float>::digits、IEEE標準の倍精度のをこっそり使用していないことも確認してくださいfloat。24にする必要があります。

になるとlong doubledigits128ビット(数字= 113)または80ビット(数字= 64)の合理的な2つのIEEE形式があるため、確認することがより重要です。

float32_t通常は浮動小数点ハードウェアを使用し、可能な場合はソフトウェアの実装に頼らないようにするため、このようにするのは現実的ではありません。


long doubleOS X(32ビットおよび64ビットIntel)上の形式は、正確にリトルエンディアン順に格納されているIEEE-754二重拡張フォーマットです。それについてファンキーなことはまったくありません。バイト0〜7は仮数フィールドを保持し、バイト8および9は指数フィールドおよび符号フィールドを保持します。
スティーブンキャノン

@Stephen:それは朗報です:v)。それは私が投稿した数字と一致しますか?
Potatoswatter 2010年

1
(他の754形式とは異なり)倍長拡張には明示的な先行仮数ビットがあるため5.0L、の仮数があることを覚えておいてくださいa000000000000000。その不偏指数は+2であり、2倍の拡張指数バイアスは3fffなので、5.0Lのバイアス指数は4001です。リトルエンディアンの順序で格納された場合の実際のバイトパターンは00 00 00 00 00 00 00 a0 01 40であり、これを2つのリトルエンディアンの64ビット整数として表示すると、観察したとおりに表示されます。
スティーブンキャノン

(*)ハードウェアにIntelによって実装された倍の拡張、つまり。二重に拡張されたフォーマットは、実際には、IEEE-754(1985)の他の2つの基本的なフォーマットとは異なります。
スティーブンキャノン

@Stephen:4001リトルエンディアンであると確信してい01 40 00 00 ...ます。他に何もない場合、最下位バイトが最初に来ます。シーケンスa0 01 40が数字のどこかに現れると思います(ローテーションのみを実行する場合)が、その理由a0を説明しておらず01 40、完全に別々になっているとは思いません。
Potatoswatter 2010年

18

float32_tやfloat64_tなどのtypedefを使用することが何らかの理由で非現実的であると思われる場合は、使い慣れたOS、コンパイラーに慣れすぎて、小さな巣の外を見ることはできないはずです。

32ビットIEEE浮動小数点演算をネイティブに実行するハードウェアと、64ビットを実行するハードウェアが存在します。時々そのようなシステムは互いに話し合わなければならないことさえあります。その場合、各プラットフォームでdoubleが32ビットか64ビットかを知ることは非常に重要です。32ビットプラットフォームが他の64ビット値に基づいて過度の計算を行う場合、タイミングと速度の要件に応じて、より低い精度にキャストすることができます。

私が自分のプラットフォームにあるビット数を正確に知らない限り、私は個人的にフロートとダブルを使用することに不快に感じます。さらに、これらを通信チャネルを介して別のプラットフォームに転送する場合も同様です。


「プラットフォームからのビット数が正確にわからない場合、個人的には浮動小数点数と倍精度浮動小数点数を使用することに不快感を覚えます。さらに、通信チャネルを介してこれらを別のプラットフォームに転送する場合はなおさらです。」-テキストファイル形式を使用しているということですか。これらには、ファイルサイズの欠点があります。32浮動小数点は4バイトが必要です。これらはテキスト形式で4桁の数字のみを表すことができます...
Pietro

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