Абсолютное значение для поплавков в ядре 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.
Другие вопросы по тегам