c# (または一般に .NET) で double から仮数と指数を取得する簡単な方法はありますか?
Google を使用してこの例を見つけましたが、それがどれほど堅牢かはわかりません。フレームワークの将来のバージョンなどで、二重の変更のバイナリ表現はありますか?
私が見つけた他の代替手段は、double の代わりに System.Decimal を使用し、Decimal.GetBits()メソッドを使用してそれらを抽出することでした。
助言がありますか?
c# (または一般に .NET) で double から仮数と指数を取得する簡単な方法はありますか?
Google を使用してこの例を見つけましたが、それがどれほど堅牢かはわかりません。フレームワークの将来のバージョンなどで、二重の変更のバイナリ表現はありますか?
私が見つけた他の代替手段は、double の代わりに System.Decimal を使用し、Decimal.GetBits()メソッドを使用してそれらを抽出することでした。
助言がありますか?
バイナリ形式は変更すべきではありません。既存の仕様に対する破壊的な変更であることは間違いありません。ジミーが言ったように、IEEE754 / IEC 60559:1989 形式であると定義されています。(C# 3.0 言語仕様セクション 1.3、ECMA 335 セクション 8.2.2)。DoubleConverter のコードは、適切で堅牢でなければなりません。
今後の参考のために、例のコードの関連ビットは次のとおりです。
public static string ToExactString (double d)
{
…
// Translate the double into sign, exponent and mantissa.
long bits = BitConverter.DoubleToInt64Bits(d);
// Note that the shift is sign-extended, hence the test against -1 not 1
bool negative = (bits & (1L << 63)) != 0;
int exponent = (int) ((bits >> 52) & 0x7ffL);
long mantissa = bits & 0xfffffffffffffL;
// Subnormal numbers; exponent is effectively one higher,
// but there's no extra normalisation bit in the mantissa
if (exponent==0)
{
exponent++;
}
// Normal numbers; leave exponent as it is but add extra
// bit to the front of the mantissa
else
{
mantissa = mantissa | (1L << 52);
}
// Bias the exponent. It's actually biased by 1023, but we're
// treating the mantissa as m.0 rather than 0.m, so we need
// to subtract another 52 from it.
exponent -= 1075;
if (mantissa == 0)
{
return negative ? "-0" : "0";
}
/* Normalize */
while((mantissa & 1) == 0)
{ /* i.e., Mantissa is even */
mantissa >>= 1;
exponent++;
}
…
}
当時の私にとってコメントは理にかなっていましたが、今ではしばらく考えなければならないと確信しています. 最初の部分の後、「生の」指数と仮数を取得します。コードの残りの部分は、それらをより簡単な方法で処理するのに役立ちます。
表現は IEEE 標準であり、変更すべきではありません。
https://msdn.microsoft.com/en-us/library/system.double(v=vs.110).aspx
Double 型は、2 進浮動小数点演算の IEC 60559:1989 (IEEE 754) 標準に準拠しています。
編集: decimal に getBits があり double にない理由は、decimal が有効数字を保持するためです。3.0000m == 3.00m ですが、指数/仮数は実際には異なります。フロート/ダブルは独自に表現されていると思います。