10 進数から IEEE 754 に変換する方法を示すいくつかのテキストとスレッドを読みましたが、10 進数を拡張せずに数値を変換する方法についてはまだ混乱しています (これは科学表記法で表されます)。
私が特に取り組んでいる9.07 * 10^23
番号は ですが、どの番号でもかまいません。私の特定の例でそれを行う方法を理解します。
10 進数から IEEE 754 に変換する方法を示すいくつかのテキストとスレッドを読みましたが、10 進数を拡張せずに数値を変換する方法についてはまだ混乱しています (これは科学表記法で表されます)。
私が特に取り組んでいる9.07 * 10^23
番号は ですが、どの番号でもかまいません。私の特定の例でそれを行う方法を理解します。
結果を 10 進数に最も近い浮動小数点数にする必要があり、倍精度浮動小数点数を使用していると仮定しています。
ほとんどの場合、比較的迅速に行う方法があります。これが簡単に言えばどのように機能するかです。
数値を、浮動小数点数として正確に表現される積または数値の分数に分割する必要があります。正確に表現できる 10 の最大累乗は 10^22 です。したがって、9.07e+23 を浮動小数点形式で取得するには、次のように記述できます。
9.07e+23 = 907 * 10^21
IEEE-754 標準によれば、単一の浮動小数点演算は正しく丸められることが保証されているため、2 つの倍精度浮動小数点数の積として計算された上記の積は、正しく丸められた結果になります。
これを変換関数で使用する場合は、おそらく 10 の累乗を配列に格納します。
この方法は 9.07e-23 では使用できないことに注意してください。この数値は 907 / 10^23 に等しいため、分母が大きすぎて正確に表現できません。このような状況や、非常に大きな数や非常に小さな数を扱う場合、何らかの高精度演算を使用する必要があります。
詳細と例については、10 進数から浮動小数点への高速パス変換を参照してください。
IEEE 浮動小数点の加算と乗算の方法を知っていれば、数値を 10 進文字列から 2 進 IEEE に変換するのはかなり簡単です。(または、C/C++ などの基本的なプログラミング言語を使用している場合)
これにはさまざまなアプローチがありますが、最も簡単なのは9.07 * 10^23
直接評価することです。
まず、次から始め9.07
ます。
9.07 = 9 + 0 * 10^-1 + 7 * 10^-2
を評価し10^23
ます。これは、10 から始めて任意の電力アルゴリズムを使用することで実行できます。
次に、結果を乗算します。
C/C++ での簡単な実装を次に示します。
double mantissa = 9;
mantissa += 0 / 10.;
mantissa += 7 / 100.;
double exp = 1;
for (int i = 0; i < 23; i++){
exp *= 10;
}
double result = mantissa * exp;
現在、逆方向 (IEEE -> 10 進数) に進むのは非常に困難です。
繰り返しますが、さまざまなアプローチもたくさんあります。これが私が考えることができる最も簡単なものです。
例として使用1.0011101b * 2^40
します。(仮数部は2進数)
まず、仮数を 10 進数に変換します (指数がないため、これは簡単なはずです)。
1.0011101b * 2^40 = 1.22656 * 2^40
ここで、バイナリ指数がゼロになるように数値を「スケーリング」します。これは、適切な 10 の累乗を掛けて、2 進指数を "取り除く" ことによって行われます。
1.22656 * 2^40 = 1.22656 * (2^40 * 10^-12) * 10^12
= 1.22656 * (1.09951) * 10^12
= 1.34861 * 10^12
したがって、答えは次のとおりです。
1.0011101b * 2^40 = 1.34861 * 10^12
この例で10^12
は、 を「スケール アウェイ」する必要がありました2^40
。必要な 10 の累乗を決定すると、単純に次のようになります。
power of 10 = (power of 2) * log(2)/log(10)