の中に stdint.h
(C99)、 boost/cstdint.hpp 、およびcstdint
(C++ 0x)ヘッダー、特にタイプint32_t
。
同様の固定サイズの浮動小数点型はありますか?何かのようなもの float32_t
?
現在、CまたはC++標準にはこのようなものはありません。実際、float
がバイナリ浮動小数点形式になるという保証すらありません。
一部のコンパイラは、float
型がIEEE-754 32ビットバイナリ形式であることを保証します。しない人もいます。実際には、float
はIEEE-754 _most non-embeddedプラットフォームのsingle
型ですが、一部のコンパイラがより広い形式で式を評価する場合の通常の注意事項はありますが適用します。
IEEE-754の2008改訂版にC言語バインディングを追加することを議論するワーキンググループがあり、そのようなtypedefの追加を推奨することを検討できます。これがCに追加された場合、C++標準が最終的には...に従うことを期待しています。
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
を使用するのは実用的ではありません。通常、使用可能な場合は浮動小数点ハードウェアを使用し、ソフトウェア実装に頼らないためです。
何らかの理由でfloat32_tやfloat64_tなどのtypedefを使用するのが実用的でないと思われる場合は、使い慣れたOSであるコンパイラーに慣れすぎて、小さな巣の外を見ることはできません。
32ビットIEEE浮動小数点演算をネイティブに実行するハードウェアや、64ビットを実行するその他のハードウェアがあります。そのようなシステムは互いに対話する必要がある場合もあります。その場合、各プラットフォームでdoubleが32ビットか64ビットかを知ることが非常に重要です。 32ビットプラットフォームが他のプラットフォームからの64ビット値に基づいて過度の計算を行う場合、タイミングと速度の要件に応じて、より低い精度にキャストすることができます。
私の個人的には、floatとdoubleを使用するのは不快です。これらを何らかの通信チャネルを介して別のプラットフォームに転送する場合はさらにそうです。
現在、次のタイプを言語に追加する提案があります。
decimal32
decimal64
decimal128
いつかは#include <decimal>
。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html