如何(理论上)在C#中打印所有可能的双精度数字?

时间:2015-01-05 13:49:57

标签: c# .net tostring

对于一个小小的个人研究项目,我想生成一个双精度浮点数可以具有的所有可能值的字符串列表。

我发现了" r"格式化选项,它保证可以将字符串解析回完全相同的位表示:

string s = myDouble.ToString("r");

但是如何生成所有可能的位组合?最好按价值排序。

也许以某种方式使用unchecked关键字?

unchecked
{
    //for all long values
    myDouble[i] = myLong++;
}

免责声明:这是一个理论问题,我不会阅读所有数字......:)

3 个答案:

答案 0 :(得分:3)

使用不安全的代码:

ulong i = 0; //long is 64 bit, like double
unsafe
{
    double* d = (double*)&i;
    for(;i<ulong.MaxValue;i++)
        Console.WriteLine(*d);
}

答案 1 :(得分:3)

您可以从所有可能的值开始0&lt; = x&lt; 1.你可以通过给指数为零来创建它们,并为尾数使用不同的值。

尾数存储在64位的52位中,形成双精度数,因此在0和1之间可以得到2 ^ 52 = 4503599627370496个不同的数字。

description of the decimal format您可以了解这些数字的位模式(八个字节)应该如何,然后您可以使用BitConverter.ToDouble method进行转换。

然后你可以设置第一位来制作所有这些数字的负面版本。

所有这些数字都是唯一的,除此之外,您将开始获取重复值,因为当指数非零时,有几种方法可以表达相同的值。对于每个新的非零指数,您将获得使用以前使用的指数无法表达的值。

然而,0到1之间的值会让你在可预见的未来中忙碌,所以你可以从那些开始。

答案 2 :(得分:0)

这应该在安全代码中可行:创建一个位字符串。将其转换为double。输出。增量。重复....很多。

string bstr = "01010101010101010101010101010101"; // this is 32 instead of 64, adjust as needed
long v = 0;
for (int i = bstr.Length - 1; i >= 0; i--) v = (v << 1) + (bstr[i] - '0');
double d = BitConverter.ToDouble(BitConverter.GetBytes(v), 0);

//增加bstr和循环