为什么指数运算符在OCaml中使用浮点变量?

时间:2014-03-31 13:03:54

标签: ocaml

为什么指数运算符在OCaml中使用浮点变量? 难道它也不允许使用int变量吗?

# 3**3;;
Error: This expression has type int but an expression was expected of type
         float

使用:

# 3.0**3.0;;
- : float = 27.

3 个答案:

答案 0 :(得分:3)

所以,现有的答案是如何解决这个问题,而不是为什么会这样。主要有两个原因:

1)OCaml没有运算符别名。你不能让两个运营商做同样的事情,而是做不同的类型。这意味着只有一种数字,整数或浮点数(或其他表示形式)才能使用标准的**接口。

2)pow(),指数函数历来在浮点数上定义(例如,在Standard C中)。

此外,另一种解决问题的方法是,如果您使用的是OCaml电池,则会为整数定义pow函数。

答案 1 :(得分:2)

您可以使用int

let int_exp x y = (float_of_int x) ** (float_of_int y) |> int_of_float

答案 2 :(得分:0)

有一个类似的问题:Integer exponentiation in OCaml

这是一个可能的尾递归整数取幂的实现:

let is_even n = 
  n mod 2 = 0

(* https://en.wikipedia.org/wiki/Exponentiation_by_squaring *)
let pow base exponent =
  if exponent < 0 then invalid_arg "exponent can not be negative" else
  let rec aux accumulator base = function
    | 0 -> accumulator
    | 1 -> base * accumulator
    | e when is_even e -> aux accumulator (base * base) (e / 2)
    | e -> aux (base * accumulator) (base * base) ((e - 1) / 2) in
  aux 1 base exponent