OCaml漂浮盒装或非盒装?

时间:2013-09-23 16:19:03

标签: floating-point ocaml

我知道浮点数通常是在OCaml中装箱,但我的难点是这个词:通常。他们什么时候没有盒装?并且,如果它们没有盒装,它们是如何表示的,因此运行时将它们识别为与int或指针不同?

我找到了http://caml.inria.fr/pub/old_caml_site/ocaml/numerical.html,其中列出了浮动没有装箱的某些时间,但它已经11年了,所以我不知道它是否仍然是最新的,并且它没有解释他们如何在没有盒装时被代表。

我是OCaml的新手,很抱歉,如果这是一个愚蠢的noob问题。谢谢!

3 个答案:

答案 0 :(得分:7)

当在数组中并且在记录中所有字段都是float时,浮点数将被取消装箱。这些案例有一个特殊标记,用于将集合标记为包含未装箱的浮动。

这在OCaml手册的Section 19.3中有所描述。

答案 1 :(得分:4)

浮动在两种情况下都是未装箱的:

  • 当数组中只有浮点数(即使在多态函数中)或记录中时(此时,只有在编译时所有字段都被确定为浮点数)

  • 在浮点运算的序列中:编译器会注意到,在使用它进行下一次操作的拆箱之前装入一个浮点数是没用的,所以浮点数仍然是未装箱的。在:

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

    y不会被装箱。这种优化也在int32,int64和nativeint上完成,因此它们在繁重的计算中实际上具有非常好的性能。

答案 2 :(得分: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 *)