C#解惑29: 迴圈者的新娘

來源:互聯網
上載者:User

謎題29: 迴圈者的新娘
    請提供一個對i的聲明,將下面的迴圈轉變為無限迴圈:
    while (i != i)
    {
    }

解惑29: 迴圈者的新娘
    這個迴圈可能比前一個更令人困惑。不管在它前面作何種聲明,它看起來確實應該立即終止。一個數字總是等於它自己,對吧?
    對,但IEEE 754浮點算術保留了一個特殊的值用來表示一個不是數位數量。這個值就是NaN(“Not a Number(不是一個數字)”的縮寫),對於所有沒有良好的數字定義的浮點計算,例如0.0/0.0,其值都是它。規範中描述道,NaN不等於任何浮點數值,包括它自身在內[C#語言規範 7.9.2]。因此,如果i在迴圈開始之前被初始化為NaN,那麼終止條件測試(i != i)的計算結果就是true,迴圈就永遠不會終止。很奇怪但卻是事實。
    可以用任何計算結果為NaN的浮點算術運算式來初始化i,例如:
    double i = 0.0 / 0.0;
    同樣,為了表達清晰,可以使用標準類庫提供的常量:
    double i = double.NaN;
    NaN還有其他的驚人之處。任何浮點操作,只要它的一個或多個數為NaN,那麼其結果為NaN[C#語言規範 4.1.6]。這條規則是非常合理的,但是它卻具有奇怪的結果。例如,下面的程式將列印False:
    class Puzzlers29
    {
      static void Main()
      {
        double i = 0.0 / 0.0;
        System.Console.WriteLine(i - i == 0);
      }
    }
    這條計算NaN的規則所基於的原理是:一旦一個計算產生了NaN,它就被損壞了,沒有任何更進一步的計算可以修複這樣的損壞。NaN值有意使受損的計算繼續執行下去,直到到達方便處理這種情況的地方為止。
    總之,float和double類型都有一個特殊的NaN值,用來表示不是數位數量。對於涉及NaN值的計算,其規則簡單且明智,但是這些規則的結果可能是違背直覺的。   

    C#解惑總目錄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.