Может кто-нибудь объяснить мне NaN в Ruby? - PullRequest
6 голосов
/ 01 сентября 2010

Я только что нашел ошибку в некоторых манипуляциях с числами в моей программе, и я получаю FloatDomainError (NaN)

Поэтому я начал регистрировать число, переданное с помощью:

if(metric.is_a?(Numeric))
  self.metric = metric
else
  LOGGER.warn("metric #{metric} is not a number")
  self.metric=0
end

Нопереданное число равно NaN, что, по-видимому, is_a?(Numeric), так как я не получаю предупреждение журнала, и оно передает метрику в мой метод metric =, где я получаю FloatDomainError

Теперь, поправьте меня, если я ошибаюсь, но не кажется ли это семантически неправильным иметь NaN (не число) типа Numeric ??Может кто-нибудь объяснить мне это?

Кстати, используя Jruby-1.4.1

Ответы [ 2 ]

7 голосов
/ 01 сентября 2010

Я думаю, что делать NaN числом вполне логично ...

попробовать 0.0 / 0.0 в irb -> результат - NaN (в данном случае бесконечность)

Бесконечностьматематически вид числа, но, тем не менее, вы не можете выразить его типом данных ... в математике вы тоже используете специальный символ ...

PS: Вы можете использовать metric.nan?чтобы проверить это ... тогда это должно работать так, как вы ожидаете ...

5 голосов
/ 01 сентября 2010

IEEE 754 числа с плавающей запятой определяют -INFINITY + INFINITY и NotANumber, чтобы можно было реагировать, скажем, на деление на ноль.Вы также можете рассчитать с ними, например, 2 + INF = INF

NaN не уникальная рубиновая функция, они числовые в java, c ++, ... тоже

...