2016-10-03 9 views
3

В Num модуле, он сказал:Представляют бесконечность в модуле Num

Числа (тип NUM) произвольны точности рациональные числа, а также специальные элементы 1/0 (бесконечность) и 0/0 (не определено).

Ожидалось найти это infinity, но не могу найти его. Я догадался, то, что я мог бы создать его вручную:

let infinity = let one = Int 1 and zero = Int 0 in one // zero 

Но бомж:

Исключение: Ошибка "create_ratio бесконечное или неопределенное рациональное число".

Так, хорошо, есть эта val infinity : float в Pervasives, давайте найдем num_from_float. О, нет такой функции ...

Ну, кто-нибудь знает, как представлять положительную и отрицательную бесконечность с Num?

ответ

3

По умолчанию специальные номера отключены. Такое поведение можно контролировать с помощью модуля Arith_status. Например, чтобы нулевые знаменатели, используйте следующее:

Arith_status.set_error_when_null_denominator false 

После того, как флаг установлен, ваше определение бесконечности работает отлично:

let infinity = let one = Int 1 and zero = Int 0 in one // zero;; 
val infinity : Num.num = <num 1/0> 
float_of_num infinity;; 
- : float = infinity 
+0

Моя проблема, то, почему он говорит, что «inifinity "и" undefined "существуют, если они не разрешены по умолчанию? Во всяком случае, хороший ответ! – Lhooq

+1

Может быть, они должны положить в документацию Num, что некоторые действия связаны с модулем Arith_status ... – Lhooq

+1

Да, хороший вопрос ... Хотелось бы, чтобы у меня был ответ. Вероятно, разработчики решили, что специальные номера вызывают больше проблем, чем решают. Например, когда я активно работал с float, я использовал модуль 'Float.Safe', который переопределяет все операции и терпит неудачу, если какой-либо специальный номер придет в игру. Это действительно помогло мне в отладке. И да, документация должна быть точно обновлена, не скрываясь в коде, нелегко узнать, что происходит не так. – ivg

 Смежные вопросы

  • Нет связанных вопросов^_^