如何在C#中指定特定的double精度文字或值?

例如,我想在程序中使用最大double值小于1的常数。小于1的最大double是二进制形式的1.11111111 11111111 11111111 11111111 11111111 11111111 1111 x 2^(-1)。将其表示为十六进制的big-endian将是0x3fe f ffff ffff ffff

我可以使用以下代码生成它:

var largestDoubleLessThanOneBytes = new byte[] {0x3f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
if (BitConverter.IsLittleEndian) largestDoubleLessThanOneBytes = largestDoubleLessThanOneBytes.Reverse().ToArray();
double largestDoubleLessThanOne = BitConverter.ToDouble(largestDoubleLessThanOneBytes, 0);


BitConverter不能用于const的声明中,因此不能代替文字值。

使用this tool,我可以得出文字9.99999999999999888977697537484E-1,它最终是完全相同的double。 BitConverter.ToString(BitConverter.GetBytes(9.99999999999999888977697537484E-1)) == "FF-FF-FF-FF-FF-FF-EF-3F"

除了找到十进制文字(其最接近的双精度表示形式是您想要的双精度形式)之外,还有什么其他方法可以将特定的double值转换为c#代码?

最佳答案

这可能是矫kill过正,但该死,为什么不呢?

unsafe
{
    var x = 0x3fefffffffffffff;
    var d = *(double*)&x;
    Console.WriteLine("{0:r}", d);
}


您好,C#中的reinterpret_cast<>

10-08 18:59