在开发的时候,遇到一个问题,c#中定义一个double变量,当这个变量在很大的时候,让这个变量加上或者减去一个较小的值不会改变其大小(这个其实与double变量的二进制存储机制相关),就是说加上一个值以后的值.comPareTo(原来的值)返回0,就是说他们相等。c#
因而我想找到哪一个具体的值是在加上或者减去1时,值的改变能够被检测到的。因而有了如下代码。spa
//由于至关大的范围内都是能够检测到大小改变的,因此不从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=90071992647409921code
实际上,根据double值的存储结构应该是能够从理论上推算出来这个值的。详细的机制以及使用的注意事项参见MSDN(下方的连接)。这个具体的理论推算过程先留个坑在这里吧,之后有时间了过来填。blog
参考:开发
http://technet.microsoft.com/zh-cn/library/system.doubleit