コンパイル時 (または代わりに実行時) に 'float'、'double'、および 'long double' の構造を決定する C++ 標準に準拠した方法はありますか?
と を仮定するstd::numeric_limits< T >::is_iec559 == true
とstd::numeric_limits< T >::radix == 2
、次のルールによって が可能であると思われます。
- 最初の X ビットは仮数です。
- 次の Y ビットは指数です。
- 最後の 1 ビットは符号ビットです。
次の表現が漠然と好きです:
size_t num_significand_bits = std::numeric_limits< T >::digits;
size_t num_exponent_bits = log2( 2 * std::numeric_limits< T >::max_exponent );
size_t num_sign_bits = 1u;
私が知っている以外は
std::numeric_limits< T >::digits
フォーマットが実際にそれを明示的に表しているかどうかにかかわらず、「整数ビット」が含まれているため、プログラムでこれを検出して調整する方法がわかりません。- 私
std::numeric_limits< T >::max_exponent
はいつもだと思い2^(num_exponent_bits)/2
ます。
背景:私は移植可能な2つの問題を克服しようとしています:
- 仮数部にあるビットを設定/取得します。
- 「long double」の終わりがどこにあるかを判断するので、初期化されていないメモリを持つ暗黙的なパディングビットを読み取らないことがわかります。