Single UNIXSpecificationに基づいて独自のodユーティリティを作成していますが、floatの表現がどのように処理されるかについて混乱しています。例:od -t f
。私は完全に機能するユーティリティを持っていますが、それ以外の場合は仕様の他のすべての部分を処理できます。これはプログラミングの質問ではなく、floatとしてダンプするときの出力の意味に関する質問です。
たとえば、次のプログラムを実行してstdinにASCII文字A\nを提供すると、次のようになります。
$ od -A n -t fD -
1.297e-320
供給した場合[〜#〜] a [〜#〜]
$ od -A n -t fD -
3.2e-322
A文字と改行文字の値がそれぞれ65と10であることを知っているので、これらの指数関数的に小さい数値がコンテキストで何を意味するのかわかりません。仕様はフロートをあまりカバーしていないので、この点に関する情報をいただければ幸いです。
リトルエンディアンシステムでは、これはメモリ内の文字列、浮動小数点数、および倍精度浮動小数点数の表現の結果です。 「A」、65、または0x41で始まり、フロート(od -t fF
)これはに対応します
00000000000000000000000001000001
これは9.1⋅10です-44 ( この便利なコンバーター を参照)—符号(正)の場合は0ビット、指数(浮動小数点の場合は-126だけバイアスされます)、および小数部2-17 + 2-23。したがって、表される値は(2-17 + 2-23)×2-126 ( Wolfram Alpha を参照)。改行を追加すると、
00000000000000000000101001000001
これは3.678⋅10です-42。
ダブルスを使用する(od -t fD
)数値の前にさらに4バイトのゼロを追加します。これにより、符号や指数は変更されず、分数がさらに減少します。これにより、doubleのバイアスが大きくなる(-1022)ことに加えて、非常に表示される小さな数値( doubleを使用するこの他のコンバーター を参照):「A」は(2-46 + 2-52)×2-1022 ( Wolfram Alpha を参照)、「A」の後に改行が続くのは(2-41 + 2-43 + 2-46 + 2-52)×2-1022 ( Wolfram Alpha を参照)。