3

コンピュータシステムにおける float と byte の表現の違いを扱う質問があります。したがって、たとえば、float は float から int へ、およびその逆にどのように変換されますか。その結果、バイトの表現がまったく異なります。正しい方向に向けるために使用できるリソースはありますか? どんな助けでも大歓迎です!オンラインで何も見つかりません。正しい方向へのリンクは非常に役立ちます!

4

4 に答える 4

4

浮動小数点数の最も一般的なエンコードは、IEEE 754 を使用します。単精度数の場合、符号ビット (s)、8 指数ビット (e)、および 23 小数ビット (f) があります。

s、e、および f のほとんどの値について、表される値は -1 s •2 e-127 •F です。ここで、F は「1」を書き込むことによって得られる数値です。f の 23 ビットが続き、その文字列を 2 進数として解釈します。たとえば、f が 1000000000000000000000 の場合、2 進数は 1.1000000000000000000000 であり、これは (10 進数で) 1.5 であるため、F は 1.5 です。

上記は 0 < e < 255 の場合に適用されます。値 0 と 255 は特別です。

e が 0 の場合、表される値は上記と同じですが、F が「0」で始まる点が異なります。「1.」の代わりに。特に、f が 0 の場合、表現される値は 0 です。f がゼロでない場合、これらは非正規数と呼ばれます。これは、上記の主要な方法で表された正規値よりも小さいためです。

e が 255 で f が 0 の場合、符号ビット s に応じて、表される値は +infinity または -infinity になります。e が 255 で f が 0 でない場合、表される値は NaN (Not a Number) と呼ばれ、デバッグやエラーのキャッチ、その他の特別な目的に使用されます。クワイエット NaN (トラップを発生させない。通常、計算を続行して最終結果を取得し、NaN をどう処理するかを決定する場合に使用) とシグナリング NaN (トラップを発生させる。通常は使用される) があります。エラーが発生したために計算を中断したい場合)。

エンコーディングが異なるプラットフォームでどのように表示されるか、特に 32 ビット内のバイトの順序が異なる場合があります。また、IEEE 754 エンコーディングを使用しないプラットフォームもあります。

倍精度エンコーディングでは、e が 11 ビットであり、127 (指数バイアスと呼ばれる) が 1023 に変更され、f が 52 ビットであることを除いて、同じスキームが使用されます。また、指数の特別な値は、最大 8 ビットの 255 ではなく、最大 11 ビットの 2047 です。

于 2012-07-10T18:27:42.793 に答える
0

特定のプラットフォームでの表現は厳密に定義されており、そのプラットフォームの C コンパイラに認識されfloatます。intこれは、あるものを別のものに変換するための明確に定義されたアルゴリズムが常に存在することを意味します。実際には、自然なプラットフォーム固有の型が使用される場合、変換は CPU (FPU) によって内部的に実行されます。floatCPU には、メモリから内部 CPU レジスタにデータを読み込む専用コマンドがあります。その後、別のコマンドでそのデータを値としてメモリに書き戻すことができintます。およびその逆。

たとえば、x86 プラットフォームでは、float_value = int_value割り当ては通常、次のような一連の CPU コマンドに変換されます。

fld int_value   ; read `int` value from `int_value` to the internal register
fst float_value ; save `float` value from the internal register to `float_value`

ハードウェアですぐにサポートされない算術データ型を変換する場合、C コンパイラは、生成されたコードで必要なすべての変換手順を文字どおりに記述する必要があります。言語でさえサポートされていない整数型または浮動小数点型のサポートが必要な場合があります。その場合、変換を手動で実装する必要があります。

于 2012-07-10T18:34:51.083 に答える
0

一般に、浮動小数点値を「正確」であると考えるのは危険です。分数を取得したら、浮動小数点数はおそらく近似値になります。(分数を 2 進数で正確に表現できる場合は、 のように正確である可能性があります1/2。ただし、たとえば、1/10は近似値になります。)

何人かの人々がウィキペディアの記事を指摘してくれました。それらを読んでください。基本的に、float 値は符号ビット、指数、および仮数です。の浮動小数点値がある50.0場合、浮動小数点値は の整数表現のようには見えません50。(元の誤った議論は削除されました。詳細についてはコメントを参照してください。)

整数を浮動小数点数に、またはその逆に変換する簡単な方法はありません。コンピューターの CPU には、変換を行うための命令が組み込まれています。または、変換を行うプログラムを作成することもできますが、簡単なトリックはありません。

編集:上記は、間違ったものを書いた部分を削除するために編集されました。@Eric Postpischil は、私が犯した大きな間違いを指摘しました。50 の値は、私が最初に言ったことではなく、1 より大きいべき乗の小数値として格納されます。ばかげた間違いでした。申し訳ありません。彼はまた、「仮数」部分は技術的には「仮数」であることを指摘しました。それが正しいかどうかに関係なく、「仮数」と呼ばれることがよくあるとだけ言っておきます。

重要な部分を繰り返します。整数を浮動小数点数に、またはその逆に変換する簡単な方法はありません。

于 2012-07-10T18:14:21.697 に答える
0

C 標準では、浮動小数点値の表現方法は指定されていません。各実装/プラットフォームは、適切と思われる浮動小数点数を自由に実装できます。実装が従わなければならない特定の制約がありますが、ビットレベルの表現は実装によって定義されます。

一般に、浮動小数点数がどのように格納または表現されるかを予測することはできないため、この質問に書かれているとおりに答える実際の方法はありません。特定の浮動小数点の実装を念頭に置いている場合は、詳細を提供できる場合があります。ただし、これらの詳細は、その特定の実装にのみ関連します。また、CPU アーキテクチャが異なれば、同じ浮動小数点表現を使用していても、値の変換方法が異なる場合があることに注意してください。

于 2012-07-10T18:13:32.083 に答える