<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                在『[代碼之謎](http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html)』系列的前幾篇文章中,很多次出現了浮點數。 浮點數在很多編程語言中被稱為簡單數據類型,其實,浮點數比起那些復雜數據類型(比如字符串)來說, 一點都不簡單。 單單是說明 IEEE浮點數 就可以寫一本書了,我將用幾篇博文來簡單的說說我所理解的浮點數,算是拋磚引玉吧。 ## 一次面試 記得多年前我招聘 Java 程序員時的一次關于浮點數、二分法、編碼的面試, 多年以后,他已經稱為了一名很出色的程序員。 每次聚會他都會告訴我,“那次面試徹底改變了我的過去的學習方式, 我以前?**只是盲目接受知識,根本就沒有自己思考過**, 那次對話,比我大學四年學到的知識都多”。 我看他簡歷上寫到讀過《[信息論](http://www.amazon.cn/gp/product/B0011C5QLE/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B0011C5QLE&linkCode=as2&tag=justjavac-23)》才談了很多關于二分法以及編碼的話題, 整個過程大概3個小時——這是我面試時間最長的一次。 因為時間久遠,我把一些我能回憶起來的關于浮點數的內容整理在這篇博客中。 格式說明: 所有我說的話,都放在引用里面。他的話放在了引號(“”)里面。沒有加引號的是我的心理活動或者說明。 ## 浮點數個數 > 在 8 位計算機上,浮點數一共有多少個呢? “8 位的好像太過時了,現在主流的是 32 位的,好像可以表示3 x 10^38。” 果然不出我所料,?**很多畢業生都把計算機學成了文科,他們不是在學習理論知識,而是接受/背誦這些知識**。 > 8 位計算機可以表示的整數是多少個呢? “這個簡單,2的8次方,應該是 256 個。N 位計算機表示的整數就是 2 的 N 次方。” 他回答時顯得很興奮,因為他終于可以反駁我的觀點了,他沒有把計算機當作死記硬背的學科。 > 8 位計算機,或者說?**8bit 可以表示 2^8 個整數**。 如果用這 8bit 來表示字符,可以表示多少個呢? “呵呵,當然也是 2 的 8 次方了,否則就沒有必要再發明16位或者32位的 unicode 去表示漢字了。” > 如你剛才所說,8bit 可以表示 3 x 10^38 個浮點數。那么你估算一下,2bit 可以表示多少個浮點數呢? “既然 2bit 可以表示 4 個整數,浮點數嘛肯定比這個多,最少也得能表示 10 幾個浮點數吧。” > 好吧,按照你的思路,我說幾個數。 > > * 0總該有吧,用 00 表示。 > * 0.1 用 01 表示 > * 0.2 用 10 表示 > * 0.3 用 11 表示 > > 現在你把 0.4 給我表示出來? 『他思索了片刻』“哦。我明白了,?**2bit 可以表示 4 個數,不管是整數、小數或者字符**,就算是用 2bit 表示蘋果,我們也只能表示 4 個,如果想要表示更多,就得用更多的 bit 位。” 雖然他在簡歷中寫到讀過《[信息論](http://www.amazon.cn/gp/product/B0011C5QLE/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B0011C5QLE&linkCode=as2&tag=justjavac-23)》,他對?**N bit可以表示的信息量是 2^N**?肯定沒有完全理解,或者只是被動接受了這個定理。 過了一會兒他又繼續說:“按照這個邏輯,8bit 只能表示 256 個浮點數了,這也太少了。 我有點糊涂了,浮點數的表示范圍一般都得幾萬甚至幾億啊。” ## 浮點數精度 于是我在 firebug 里面寫了幾行代碼(可以在本系列第一篇的?[序言](http://justjavac.com/codepuzzle/2012/09/25/codepuzzle-introduction.html)?部分找到這些代碼)。 ~~~ 0.2 + 0.4 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 ~~~ “這怎么可能呢?JS 居然這么不嚴格?” 顯然他把這種現象歸結于 js(謝天謝地,他沒有把罪過加在 firebug 身上)。 于是我用 Java 重寫了上面的代碼,這回他只剩目瞪口呆了。 既然他已經開始?**驚訝**,那么下一步就是?**思考**。我又稍作了解釋: > 任何語言都宣稱他們的浮點數的表示范圍是 3 x 10^38,這個數到底多大呢?目前所知宇宙的年齡是 1.373 x 10^10 年。 > > 但是 32bit 最多只能表示 2^32 個數,大約是 4 x 10^9。 > > 對比一下你就會發現令人震驚的結果。 如果把浮點數的范圍比做地球,那么可以精確表示的浮點數還不到一粒芝麻大。 “這么說,0.2+0.4 是因為他不能夠精確表示,所以出現了計算錯誤的現象。那在編程中如何避免這種問題呢?” > 用?**定點數表示小數**。 ## 浮點數等價于小數嗎 “定點數不是整數嗎?定點數怎么表示小數啊?” 很顯然,有一個理論性概念錯誤。他沒有真正理解什么是定點,什么是浮點。 > 浮點數可以表示整數嗎?比如,float a = 2 可以嗎? “可以是可以,這個 2 在計算機里面應該存儲的是 2.0 吧?” > 計算機肯定沒有存儲 2.0。百分之一萬的肯定。計算機存儲的是0、1串。呵呵。 “我覺得浮點數應該不會存儲整數的2,他存儲的應該是小數的2.0,然后轉換成0、1串,是這樣嗎?” 他一連問了我幾個問題,使我感覺到,我不是在面試,而是在上課。 > **整數和小數是數學里面的概念,在計算機中,只有定點數和浮點數,沒有整數和小數**。 > > 定點數在課本里如何定義的? “忘了,只知道定點數就是整數,浮點數就是小數。好像老師也是這么講的。” > 那是因為你們老師不是我,如果我當老師,肯定不會這么教學生。『笑』 > > 定點、浮點,“點”是什么意思?“點”就是小數點。 把小數點固定,通常固定在最右面,就是定點數。 把小數點浮動,就是浮點數。浮點在哪兒?這個在 IEEE 浮點數標準里面定義的。 > > 回到前面話題,如何精確的表示小數呢?其中一種方案就是定點數。 拿 8bit 舉例吧。我們可以把小數點定在中間,用 4bit 表示整數部分,4bit 表示小數部分。 這樣構造方式(專業點我們稱他為數據結構,一般語言把整數和小數稱為簡單數據類型,其實他們一點都不簡單,而且比那些成了復合數據類型的字符串都要復雜的多),~~我們可以精確的表示64個小數~~,我們可以精確的表示 2^8 = 256 個小數(謝謝?[mfkvfn](http://mfkvfn.iteye.com/)?在 iteye 上的指正)。 * * * 在下一章,我們將構造一個 8bit 的浮點數表示形式,來深入探索浮點數不為人知的秘密。 我稱它為 JJFN-134(JustJavac Float Notation,justjavac浮點數表示法),1bit符號,3bit指數,4bit尾數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看