更容易将64位浮点数转换为位列表的方法

时间:2014-04-07 20:53:25

标签: ocaml

我正在尝试将浮点数转换为位列表。

这是我的想法:

  1. 读取floatInt64
  2. 的所有位信息
  3. mod 2 64次,每次都将01存储到列表中
  4. 处理否定案例(应用2' s补充加1)
  5. 代码是这样的:

    let convert_non_neg_64 n =
      let rec collect acc i j =
        if Int64.compare j (Int64.of_int 64) <> -1 then acc
        else collect ((Int64.rem i (Int64.of_int 2) |> Int64.to_int)::acc) (Int64.div i (Int64.of_int 2)) (Int64.succ j)
      in 
      collect [] n Int64.zero
    
    let negatify l =
      let rl = List.rev_map (fun x -> if x = 0 then 1 else 0) l in
      let rec plus1 extra acc = function
        | [] -> acc
        | hd::tl when extra = 0 -> plus1 0 (hd::acc) tl
        | hd::tl -> if hd = 0 then plus1 0 (1::acc) tl else plus1 1 (0::acc) tl
      in 
      plus1 1 [] rl
    
    let convert64 n =
      let nnl = convert_non_neg_64 (Int64.abs n) in 
      if Int64.compare n Int64.zero <> -1 then nnl
      else negatify nnl
    
    let bits_of_float fn = Int64.bits_of_float fn |> convert64 
    

    我认为代码很好。

    我的问题是是否有更简单的方法

    此外,所有这些Int64操作都非常难看,有什么好方法可以简化它?

1 个答案:

答案 0 :(得分:1)

这就是我想出来的。

let bitlist_of_float f =
    let rec blist b i64 =
        if b >= 64 then
            []
        else
            let bit =
                Int64.(if logand i64 (shift_left 1L b) = 0L then 0 else 1)
            in
            bit :: blist (b + 1) i64
    in  
    blist 0 (Int64.bits_of_float f)

列表的头部是最不重要的位(我认为这是正确的做事方式)。我还没有验证答案,所以可能会有两两个错误。

<强>更新

我相信这段代码会为您提供浮动值的位数。这就是我所说的忠实副本。&#34;忠实的副本。&#34;如果你想以某种方式修改这些位,那么你需要对它们进行更多的处理。我不清楚你有什么想做的。