0

数学の小さな質問があります。

10 進数 (たとえば 3.14) を 16 進数または 2 進数に変換する方法はありますか? 可能であれば、チュートリアルや説明へのリンクをここに配置できますか? (一部の言語では必要ありません。一般的に数学で必要です。)助けてください。

編集

コードで渡された入力:

0.1

ASM コードでの出力:

415740h

別の入力:

0.058

コンパイラによる別の出力:

00415748h

しかし、これはどのように行われたのでしょうか。どのように変換できますか?

4

2 に答える 2

2

あなたの出力サンプルが、浮動小数点数のエンコーディングまたは .1 と .058 の他の一般的な表現として認識されません。これらの数値は、アセンブラーまたはコンパイラーが浮動小数点エンコーディングを格納したアドレスであると思われます。

つまり、浮動小数点リテラルを含むテキストを書き、アセンブラーまたはコンパイラーがそのリテラルを浮動小数点エンコーディングに変換し、それをあるアドレスに格納してから、そのアドレスを浮動小数点リテラルをロードする命令に入れました。メモリからのポイント エンコーディング。

この仮説は、2 つの数の差が 8 であるという事実と一致しています。倍精度浮動小数点は通常 8 バイトであるため、2 番目のアドレス (0x415748) は最初のアドレス (0x415740) を 8 バイト超えています。

数値を浮動小数点でエンコードするプロセスは、おおよそ次のとおりです。

エンコードする数値を x とします。

x が正の場合は s (符号ビット) を 0 に設定し、x が負の場合は 1 に設定します。x を x の絶対値に設定します。

e (指数) を 0 に設定します。次のいずれか適切な方を繰り返します。

  • x が 2 以上の場合、e に 1 を加えて x を 2 で割ります。x が 2 未満になるまで繰り返します。
  • x が 1 未満の場合、e に -1 を加え、x に 2 を掛けます。x が 1 以上になるまで繰り返します。

上記を完了すると、x は少なくとも 1 で 2 未満です。また、元の数は (-1) s ·2 e ·x に等しくなります。つまり、符号ビット (s)、2 の指数 (e)、および [1, 2) (1 を含み、2 を除く) 内の仮数 (x) で数値を表現しました。

f = (x-1)・2 52と設定します。f を最も近い整数に丸めます (2 つの整数が同数の場合は、偶数の整数に丸めます)。f が 2 52の場合、f を 0 に設定し、e に 1 を加算します。(このステップでは、x が 2 進数として表される場合、「小数点」の直後にある x の 52 ビットを見つけ、52 桁目以降を丸めます。その位置での丸めによって x が2に丸められる場合は、指数を調整します。 、これは必要な間隔から外れています。)

e に 1023 を追加します。これは、x に関して数値的な意味はありません。これは単に浮動小数点エンコーディングの一部です。デコードすると、1023 が減算されます。

ここで、s、e、および f を 2 進数に変換します。s は正確に 1 桁、e は 11 桁、f は 52 桁を使用します。必要に応じて、先行ゼロを含めて、e が正確に 11 の 2 進数で表され、f が正確に 52 の 2 進数で表されるようにします。これらの数字を連結すると、64 ビットになります。これは、倍精度浮動小数点数の一般的な IEEE 754 エンコーディングです。

いくつかの特殊なケースがあります: 元の数値がゼロの場合、s、e、および f にゼロを使用します。(特別な「負のゼロ」を表すために、s を 1 にすることもできます。1023 を加算する前に e が -1022 より小さい場合、「非正規化」の結果またはゼロを取得するためにいくつかの調整を行う必要がありますが、私はそれを行いません。 1023 を加算する前に e が 1023 より大きい場合、数値の大きさが浮動小数点で表すには大きすぎます. e を設定することにより (1023 を加算した後)、代わりに無限大としてエンコードできます。 2047 に、f をゼロにします。

于 2012-06-25T02:44:06.500 に答える
0

10 進数から浮動小数点: http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html

于 2012-06-24T14:17:42.993 に答える