在开发的时候,遇到一个问题,c#中定义一个double变量,当这个变量在很大的时候,让这个变量加上或者减去一个较小的值不会改变其大小(这个其实与double变量的二进制存储机制相关),就是说加上一个值之后的值.comPareTo(原来的值)返回0,就是说他们相等。
于是我想找到哪个具体的值是在加上或者减去1时,值的改变可以被检测到的。于是有了以下代码。
//因为相当大的范围内都是可以检测到大小改变的,所以不从1开始,节约时间
double a = 10000000;
double pre_a = 0;
double b = 0;
double c = 0;
int c1 = 0;
int c2 = 0;
double addValue = 1;
while (true)
{
pre_a = a;
a += addValue;
b = a + 1;
c = b + 1;
c1 = a.CompareTo(b) ;
c2 = b.CompareTo(c);
if ((c1 < 0) && (c2 == 0))
{
//输出最后结果
Console.WriteLine("a = " + a + " b = " + b + " c = " + c);
break;
}
if ((c1 < 0) && (c2 < 0))
{
addValue *= 2;
}
else
{
//求解过程中,跳过了目标值,回到上一个值从新开始找
Console.WriteLine("跳过目标值,a=" + a);
a = pre_a;
addValue = 1;
}
}
求出来的结果是:a=90071992647409921