2

float/double を固定小数点に変換して元に戻す関数をいくつか書いています。float または double の指数部分に使用されるビット数を決定する最良の方法を知っている人はいますか? std::numeric_limits から何かを使用したいと思っていましたが、運がありませんでした。

指数部は C++ 標準で定義されていますか、それともコンパイラ/マシン固有ですか? または、実行時に変更できますか?

4

4 に答える 4

6

floatそのプラットフォームでIEC-559(米国ではIEEE 754)でエンコードされている場合、常に8ビットになります。doubleそのプラットフォームのがIEC-559(または64ビットバージョン)でエンコードされている場合は、常に11になります。そうでない場合は、指数が格納されているとは想定できません。

標準では浮動小数点数を格納する形式が指定されていませんが、C ++ 11(およびC ++ 03?)では、(浮動小数点型はどこですか?)を使用してIEC-559に準拠しているかどうfloatかをテストできます。 )::doublenumeric_limits<T>::is_iec559T

#include <limits>

cout << "float is IEC-559?  " << numeric_limits<float>::is_iec559 << endl
     << "double is IEC-559? " << numeric_limits<double>::is_iec559 << endl;
于 2012-01-12T15:54:27.967 に答える
1

numeric_limits<>::{min_exponent, max_exponent} に何が欠けていますか? (それらは、正規化された数値の答えを与えるように制約されています。それがあなたに合わない場合は、 と を組み合わせてくださいdenorm) digits

于 2012-01-12T16:24:56.930 に答える
0

IEEE-754を読んでください。との指数サイズは、それぞれ8ビットと11ビットである必要がありますfloatdouble

于 2012-01-12T15:55:16.757 に答える
0

浮動小数点数の特性は、マシンのアーキテクチャによって異なります。実行時に変化しません。コンパイラのヘッダー < cfloat > を見てください。詳細が記載されているはずです。

しかし、自分でマシンに飛び込むこともできます。20.1 章 (数値の少ないアルゴリズム) で名前が付けられたプログラムが含まれており、machar.c標準ライブラリ ヘッダーから何も想定せずにマシンの浮動小数点機能を検出します。オンラインでも入手できます。

于 2012-01-12T16:29:23.617 に答える