在開發(fā)的時候,遇到一個問題,c#中定義一個double變量,當(dāng)這個變量在很大的時候,讓這個變量加上或者減去一個較小的值不會改變其大小(這個其實(shí)與double變量的二進(jìn)制存儲機(jī)制相關(guān)),就是說加上一個值之后的值.comPareTo(原來的值)返回0,就是說他們相等。
于是我想找到哪個具體的值是在加上或者減去1時,值的改變可以被檢測到的。于是有了以下代碼。
//因?yàn)橄喈?dāng)大的范圍內(nèi)都是可以檢測到大小改變的,所以不從1開始,節(jié)約時間 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)) { //輸出最后結(jié)果 Console.WriteLine("a = " + a + " b = " + b + " c = " + c); break; } if ((c1 < 0) && (c2 < 0)) { addValue *= 2; } else { //求解過程中,跳過了目標(biāo)值,回到上一個值從新開始找 Console.WriteLine("跳過目標(biāo)值,a=" + a); a = pre_a; addValue = 1; } }
求出來的結(jié)果是:a=90071992647409921

實(shí)際上,根據(jù)double值的存儲結(jié)構(gòu)應(yīng)該是可以從理論上推算出來這個值的。詳細(xì)的機(jī)制以及使用的注意事項(xiàng)參見MSDN(下方的鏈接)。這個具體的理論推算過程先留個坑在這里吧,以后有時間了過來填。
參考:
http://technet.microsoft.com/zh-cn/library/system.double
新聞熱點(diǎn)
疑難解答
圖片精選