C / C ++とC#で2進数を変換すると、丸めによって2つの異なる結果が得られます。たとえば1000010000010110110000010111111
、C#で取得34.84448
しますが34.844479
、取得するときに取得しますが、なぜこの小さな違いがあるのでしょうか。C#での変換:
float f = System.BitConverter.ToSingle(bytearray,0);
//bytearray is an array that contains our binary number
C ++の場合:
int a = 1108041919; //The number that is being represented
float f = *(float *)&a;
同じ浮動小数点値を10進数で明確に表す方法はたくさんあります。たとえば、正確な出力の後に任意の数のゼロを追加できます(2の各累乗は有限長の10進表現であるため、すべての浮動小数点数も同様であることに注意してください)。
「余分な桁の印刷をいつ停止できるか」の基準は、通常、「10進出力を再度フロートに解析した場合にまったく同じ値が返されるときに、余分な桁の印刷を停止できる」として選択されます。つまり、floatの「ラウンドトリップ」を出力することが期待されます。
10進表現34.844479
とを解析すると34.84448
、両方とも浮動小数点値0x420b60bf
またはに変換されることがわかります01000010000010110110000010111111
。したがって、これらの文字列は両方とも同じ浮動小数点数を表します。(出典:https://www.h-schmidt.net/FloatConverter/IEEE754.htmlで自分で試してみてください)
あなたの質問は、「異なるランタイムライブラリが同じフロートに対して異なる値を出力するのはなぜですか?」という答えになります。答えは、「数字の印刷をいつ停止するかはライブラリ次第です。停止する必要はありません。最低限で」。再度解析したときに同じフロートを取り戻すことができる限り、ライブラリはその役割を果たしました。
まったく同じ10進文字列を表示したい場合は、適切なフォーマットオプションを使用してそれを実現できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加