C# 在c中指定特定的双精度文字#

C# 在c中指定特定的双精度文字#,c#,double,C#,Double,如何在c#中指定特定的double精度文字或值 例如,我想在程序中使用小于1的最大double值的常数。小于1的最大double是二进制的1.1111111111111111111111111111111111111111111111 x 2^(-1)。将其表示为十六进制的大端双精度将是0x3fe f ffff ffff 我可以使用以下代码生成它: var largestDoubleLessThanOneBytes = new byte[] {0x3f, 0xef, 0xff, 0xff, 0x

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

例如,我想在程序中使用小于1的最大
double
值的常数。小于1的最大
double
是二进制的
1.1111111111111111111111111111111111111111111111 x 2^(-1)
。将其表示为十六进制的大端双精度将是
0x3fe f 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
的声明中,因此不能用它代替文字值

使用,我可以得出文本
9.999999999999888977697537484E-1
,它最终是完全相同的双精度<代码>BitConverter.ToString(BitConverter.GetBytes(9.999999999999999888977697537484E-1))==“FF-FF-FF-FF-FF-EF-3F”


除了找到最接近双精度表示的十进制文本外,还有其他方法可以将特定的
double
值输入c#code吗?

这可能有些过分,但该死,为什么不呢

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

您好,
在C#

中重新解释cast
您还可以让C#code使用
.ToString(“R”)
为双精度输出适当的十进制文字。在这种情况下,它将是
0.999999999999 89
。试图在字符串格式中添加足够多的小数位以输出足够精确的值以用作文本是行不通的,因此在Java中,我将使用Math.nextAfter(1.0,Double.NEGATIVE_∞)。这可能是C#nextAfter函数的情况吗?不幸的是,.Net 4.5 C#编译器不够聪明,无法优化
*&
,更不用说
*(double*)&
。它产生了一个
ldc.i8
stloc
lsloca.s
conf.u
ldind.r8
stloc
,并使用两个局部变量,而不是简单的
ldc.r8
stloc/code>,在JIT编译期间对.Net代码进行了真正的优化。我不知道抖动有多聪明,但它可能在这里扮演重要角色。无论如何,既然您想指定一个编译时常量,那么它就不太重要了。