web-dev-qa-db-ja.com

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

の中に stdint.h(C99)、 boost/cstdint.hpp 、およびcstdint(C++ 0x)ヘッダー、特にタイプint32_t

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

79
Pietro

現在、CまたはC++標準にはこのようなものはありません。実際、floatがバイナリ浮動小数点形式になるという保証すらありません。

一部のコンパイラは、float型がIEEE-754 32ビットバイナリ形式であることを保証します。しない人もいます。実際には、floatはIEEE-754 _most non-embeddedプラットフォームのsingle型ですが、一部のコンパイラがより広い形式で式を評価する場合の通常の注意事項はありますが適用します。

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

42
Stephen Canon

floatがIEEE 32ビット型かどうかを知りたい場合は、std::numeric_limits<float>::is_iec559を確認してください。関数ではなく、コンパイル時の定数です。

より安全にしたい場合は、std::numeric_limits<float>::digitsもチェックして、floatにIEEE標準の倍精度を使用していないことを確認してください。 24でなければなりません。

long doubleに関しては、128ビット(桁= 113)または80ビット(桁= 64)の合理的なIEEE形式がいくつかあるため、digitsを確認することがより重要です。

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

28
Potatoswatter

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

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

私の個人的には、floatとdoubleを使用するのは不快です。これらを何らかの通信チャネルを介して別のプラットフォームに転送する場合はさらにそうです。

15
EmbeddedCoder

現在、次のタイプを言語に追加する提案があります。

decimal32
decimal64
decimal128

いつかは#include <decimal>

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

3
Trevor Hickey