2010-09-01 2 views
6

Я просто нашел ошибку в некотором количестве манипуляций в моей программе, и я получаю FloatDomainError (NaN)Может кто-нибудь объяснить мне NaN в Ruby?

Так что я начал протоколирование номера передается с использованием:

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 (Not A Number) будет иметь тип Numeric ?? Может кто-то объяснить это мне?

BTW с использованием JRuby-1.4.1

+1

Если бы только некоторые индийские рестораны. . :) не удалось: D – 2010-09-01 14:23:00

+1

у нас был бы восхитительный ответ :) – brad

ответ

5

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

NaN не является особенностью рубина стоимость создания эксклюзивной, они являются числами в Java, C++, ... тоже

7

Я думаю, что делает NaN ряд делает совершенно ощутить ...

попытаться 0,0/0,0 в IRB -> результат NaN (который в данном случае является бесконечность)

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

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

+0

Достаточно честно, я просто думаю семантически, что «Не номер» - это номер немного странный ... – brad

+0

@brad: ну, я согласен , название этого состояния не выбрано хорошо ... :) – apirogov