この質問の目的のために、私には施設を使用する能力がありませんprintf
(残念ながら、理由はわかりませんが、今のところ、私が何をしているのかを知っていると仮定しましょう)。
IEEE754単精度数の場合、次のビットがあります。
SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
ここS
で、は符号、E
は指数、F
は分数です。
NaN
記号の印刷は、 (E == 0xff, F != 0
)、Inf
(E == 0xff, F == 0
)、0
(E == 0, F == 0
、指数バイアスが使用されていないという理由だけで特別と見なされる)などのすべての特殊なケースをキャッチするのと同様に、すべてのケースで比較的簡単です。
2つの質問があります。
E == 0, F != 0
1つ目は、非正規化された数値(where )を正規化された数値(where)に変換する最善の方法1 <= E <= 0xfe
です。次の質問への答えを単純化するためにこれが必要になると思います(しかし、私は間違っている可能性があるので、遠慮なく私を教育してください)。
2番目の質問は、正規化された数値を印刷する方法です。-3.74195E3
指数関数のような方法と非指数関数のような方法の2つの方法でそれらを印刷できるようにしたいと思います3741.95
。ただし、これら2つを並べて見るだけで、小数点を移動するだけで前者を後者に変えるのはかなり簡単なはずです。それでは、指数形式に集中しましょう。
ずっと前にPIを印刷するために使用したアルゴリズムの漠然とした思い出があります。ここでは、減少し続ける数式の1つを使用し、可能性の上限と下限を維持し、両方の制限が一致したときに桁を出力し、計算を次のようにシフトします。係数10(したがって、上限と下限が
3.2364
と3.1234
の場合、を出力3
して計算で調整できます)。しかし、それをやったのは久しぶりなので、それがここでの適切なアプローチかどうかさえわかりません。
1/2
小数部( 、、など)を移動するとき、各ビットの値は前のビットの半分であるため、そう思われ1/4
ます1/8
。
どうしても必要な場合を除いて、ソースコードを調べなくprintf
てもいいので、誰かがこれを手伝ってくれるなら、私は永遠に感謝します。