浮動小数点( PDFも)、IEEE-754 を更新し、文字列に変換するときの浮動小数点の丸めに関するこのディスカッションに参加して、いじくり回しました。は同じ。
免責事項: この議論では、IEEE-754 で説明されているように、32 ビットと 64 ビットの浮動小数点に固執したいと思います。拡張浮動小数点 (80 ビット) やクワッド (128 ビット IEEE-754-2008)、その他の標準 (IEEE-854) には興味がありません。
背景: コンピュータは0.1
バイナリ表現で表現するのが苦手です。C# では、float はこれを3DCCCCCD
内部的に (C# は最も近い値への丸めを使用する) として表し、double は として表し3FB999999999999A
ます。0.100000005
10 進数(float) と0.1000000000000000124
(double) には同じビット パターンが使用されますが、(double) には使用されません0.1000000000000000144
。
便宜上、次の C# コードはこれらの内部表現を示しています。
string GetHex(float f)
{
return BitConverter.ToUInt32(BitConverter.GetBytes(f), 0).ToString("X");
}
string GetHex(double d)
{
return BitConverter.ToUInt64(BitConverter.GetBytes(d), 0).ToString("X");
}
// float
Console.WriteLine(GetHex(0.1F));
// double
Console.WriteLine(GetHex(0.1));
の場合0.1
、同じビット パターンで表される下位の 10 進数はなく、いずれも0.99...99
異なるビット表現が生成されます (つまり、内部的に0.999999937
生成される浮動小数点数)。3F7FFFFF
私の質問は簡単です。同じバイナリ表現で内部的に格納されている特定の float (または double) の 10 進数の最小値と最大値を見つけるにはどうすればよいですか。
理由: (質問されることは承知しています) .NET を文字列に変換するとき、および文字列から変換するときの丸めのエラーを見つけ、内部の正確な値を見つけ、自分の丸めエラーをよりよく理解するためです。
私の推測では、仮数を取り、残りを削除し、正確な値を取得し、1 つ (仮数ビット) 高くして、平均を計算します。それより下の値は同じビット パターンになります。私の主な問題は、小数部分を整数として取得する方法です(ビット操作は私の最強の資産ではありません)。Jon Skeet の DoubleConverterクラスが役に立つかもしれません。