float/double を固定小数点に変換して元に戻す関数をいくつか書いています。float または double の指数部分に使用されるビット数を決定する最良の方法を知っている人はいますか? std::numeric_limits から何かを使用したいと思っていましたが、運がありませんでした。
指数部は C++ 標準で定義されていますか、それともコンパイラ/マシン固有ですか? または、実行時に変更できますか?
float/double を固定小数点に変換して元に戻す関数をいくつか書いています。float または double の指数部分に使用されるビット数を決定する最良の方法を知っている人はいますか? std::numeric_limits から何かを使用したいと思っていましたが、運がありませんでした。
指数部は C++ 標準で定義されていますか、それともコンパイラ/マシン固有ですか? または、実行時に変更できますか?
float
そのプラットフォームでIEC-559(米国ではIEEE 754)でエンコードされている場合、常に8ビットになります。double
そのプラットフォームのがIEC-559(または64ビットバージョン)でエンコードされている場合は、常に11になります。そうでない場合は、指数が格納されているとは想定できません。
標準では浮動小数点数を格納する形式が指定されていませんが、C ++ 11(およびC ++ 03?)では、(浮動小数点型はどこですか?)を使用してIEC-559に準拠しているかどうfloat
かをテストできます。 )::double
numeric_limits<T>::is_iec559
T
#include <limits>
cout << "float is IEC-559? " << numeric_limits<float>::is_iec559 << endl
<< "double is IEC-559? " << numeric_limits<double>::is_iec559 << endl;
numeric_limits<>::{min_exponent, max_exponent} に何が欠けていますか? (それらは、正規化された数値の答えを与えるように制約されています。それがあなたに合わない場合は、 と を組み合わせてくださいdenorm
) digits
。
IEEE-754を読んでください。との指数サイズは、それぞれ8ビットと11ビットである必要がありますfloat
。double