2014-11-04 47 views
0

我想知道浮點數和如何工作的雙重之間進行總和。 我怎樣才能總結兩個雙(或浮點數)使用位運算?如何爲位操作

+3

你知道如何點浮點數來表示,如IEEE-754? – 2014-11-04 09:57:39

+0

看:https://stackoverflow.com/questions/4743115/how-do-i-use-bitwise-operators-on-a-double-on-c – matekm 2014-11-04 09:59:09

+0

@matekm這個問題是不同的。這個問題是關於實現浮點加法。 – 2014-11-04 10:00:50

回答

8

簡短的回答:如果你要問,你是不是要實現從位運算符浮點加法。這是完全可能的,但有一些細節需要你以前問過。你可以通過實現一個double→float轉換函數來開始,它更簡單,但會向你介紹許多概念。你也可以做雙→最接近的整數作爲exercise

儘管如此,這裏是另外的幼稚版本:

使用對於每個兩個操作數的位的大陣列(254 + 23爲float,2046 + 52 double)。根據指數將有效位置放在數組中的正確位置。假設參數都被歸一化,不要忘記放置隱含的前導1.添加兩個數組,其通常規則爲binary addition。然後將結果數組轉換爲浮點格式:首先查找最左邊的1;這個最左邊的1的位置決定了指數。結果的有效位在該前導1之後開始,分別爲23或52位寬。之後的位決定值是否應該向上舍入或向下舍入。

雖然這是天真的版本,這已經是相當複雜的。

非天真版本不使用2100位寬陣列,而是利用一些「保護位」代替(請參見this document中的「四捨五入」部分)。

附加微妙之處包括:

  • 的參數的符號位可意味着大小應減去的添加,或添加了一個減法。
  • 其中一個參數可以是NaN。那麼結果是NaN。
  • 其中一個參數可以是無窮大。如果另一個參數是有限或相同的無窮大,結果是相同的無窮大。否則,結果是NaN。
  • 其中一個參數可以是非規格化的數字。在這種情況下,在將數字傳送到位數組進行添加時,不會有前導1。
  • 加法的結果可以是一個無窮大:根據實現的細節,這將被認爲是指數太大而不適合格式,或者在添加二進制數組時溢出(溢出也可以在舍入步驟期間發生)。
  • 加法的結果可以是非規格化的數字。這被認爲是在比特陣列的前2046比特中缺少前導1。在這種情況下,數組的最後52位應該被轉換爲結果的有效位數,並且指數應該被設置爲零,以指示非規格化的結果。
+0

+1「如果你需要問」。這就是那些詢問的人的答案不同的問題之一。 – gnasher729 2014-11-04 10:33:06

+0

@ gnasher729我想知道3分鐘是否我想關閉爲「太寬泛」或回答,而我只是開始回答,因爲我不知道即使是簡單的方法會有多複雜。不過,如果是從一個開始並且對許多困難中的一個感到困惑的人來說,這將是一個很好的問題。 – 2014-11-04 10:35:50