Абсолютное значение для поплавков в ядре OCaml
Мне нужна функция абсолютного значения для чисел с плавающей точкой в OCaml, и ядро языка, похоже, не обладает такой функцией, поэтому я написал следующее:
let absF (f:float) = if f > 0.0 then f else (f *. -1.0);;
который, кажется, работает на позитивы, но не на негативы, ссылаясь на:
Это выражение имеет тип float -> float, но здесь используется с типом int
В чем ошибка в моей логике?
3 ответа
Решение
Когда вы печатаете
absF -1.0;;
OCaml интерпретирует это как
(absF) - (1.0);;
то есть как вычитание. Вместо этого делай
absF (-1.0);;
Основной язык имеет один, abs_float
,
Также вы можете использовать ~-.
обозначать унарное отрицание, и это относится и к целым числам с ~-
оператор. Вы можете определить такой оператор (даже если он уже существует) следующим образом:
let (~-) a : int = 0 - a
let (~-.) a : float = 0.0 -. a
Если у вас есть значение int можно использовать
# abs(-1)
- : int = 1
иначе, если у вас есть поплавок
# abs_float(-1.0)
- : float = 1.