Абсолютное значение для поплавков в ядре OCaml - PullRequest
8 голосов
/ 20 марта 2009

Мне нужна функция абсолютного значения для чисел с плавающей точкой в ​​OCaml, и ядро ​​языка, похоже, не обладает такой функцией, поэтому я написал следующее:

let absF (f:float) = if f > 0.0 then f else (f *. -1.0);;

, который, кажется, работает на позитивы, но не на негативы, ссылаясь на:

Это выражение имеет тип float -> float, но здесь используется с типом int

В чем ошибка в моей логике?

Ответы [ 3 ]

13 голосов
/ 20 марта 2009

Базовый язык имеет один, abs_float.

Кроме того, вы можете использовать ~-. для обозначения унарного отрицания, что также относится к целым числам с оператором ~-. Вы можете определить такой оператор (даже если он уже существует) следующим образом:

let (~-) a : int = 0 - a
let (~-.) a : float = 0.0 -. a
10 голосов
/ 20 марта 2009

При вводе

absF -1.0;;

OCaml интерпретирует это как

(absF) - (1.0);;

т.е. как вычитание. Вместо этого сделайте

absF (-1.0);;
3 голосов
/ 20 ноября 2015

, если у вас есть значение int, можно использовать

# abs(-1)
- : int = 1

иначе, если у вас есть поплавок

# abs_float(-1.0)
- : float = 1.
...