对于一个小小的个人研究项目,我想生成一个双精度浮点数可以具有的所有可能值的字符串列表。
我发现了" r"格式化选项,它保证可以将字符串解析回完全相同的位表示:
string s = myDouble.ToString("r");
但是如何生成所有可能的位组合?最好按价值排序。
也许以某种方式使用unchecked
关键字?
unchecked
{
//for all long values
myDouble[i] = myLong++;
}
免责声明:这是一个理论问题,我不会阅读所有数字......:)
答案 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和循环