2013-09-23 47 views
7

我知道浮點數通常在OCaml中裝盒,但我的難處在於這個詞:通常情況下。他們什麼時候沒有裝盒?而且,如果它們沒有裝箱,它們是如何表示的,以便運行時識別它們與整數或指針不同?OCaml漂浮盒裝或非盒裝?

我發現了http://caml.inria.fr/pub/old_caml_site/ocaml/numerical.html,其中列出了某些時候浮動沒有裝箱,但它已經11歲了,所以我不知道它是否仍然是最新的,並且它不能解釋它們如何「當沒有裝箱時重新表示。

我是OCaml的新手,很抱歉如果這是一個愚蠢的noob問題。謝謝!

回答

7

浮動數組在數組中以及當記錄中的所有字段均爲浮點數時都會被拆箱。這些情況下有一個特殊標記,標記集合包含無箱浮動。

這在OCaml手冊的Section 19.3中描述。

2

除了Jeffrey的回答,請注意多態字段(偶然分配一個浮點數)做而不是在「所有字段必須是浮點數」條件中計爲浮點數。

即:

type r = { x: float; y: float; } 
let a = { x = 1.0; y = 2.0; } (* unboxed *) 

type 'a r = { x: 'a; y: 'a; } 
let a = { x = 1.0; y = 2.0; } (* boxed *) 
4

浮標是在2種情況裝箱:

  • 當在陣列中(即使在多態函數)僅漂浮,或者在一個記錄(這一次,只有在編譯時確定所有字段爲浮點數)

  • 在浮點操作序列中:編譯器會注意到它對於框一個浮動在將其拆箱之前使用它的下一個操作,所以浮動仍然是取消裝箱。在:

    let x = 
        let y = a +. b in 
        y *. c 
    

    y不會被裝箱。這種優化也是在int32,int64和nativeint上完成的,因此它們在大量計算中具有非常好的性能。