Внезапно

Sep 28, 2009 09:58

Оказывается, в C# 3.5 Double.NaN != Double.NaN. Интересная у них, в Microsoft, логика.
Куда бежать, кому жаловаться?

программерское, microsoft

Leave a comment

Comments 8

1greywind September 28 2009, 06:26:19 UTC
таки чему оно равно? a = Double.NaN != Double.NaN даст true или false? Вообще говоря NaN - это специальное значение, сравнивать по которому величины бесмыссленно. Можно только проверить, был ли результат операции NaN или нет. В ECMA Script для этого имеется специальная функция на топлевеле - isNaN(val:*):Boolean

Reply

bf_xor September 28 2009, 06:31:40 UTC
Double.NaN != Double.NaN == true
У меня своя специфика - Double обернут другим типом (так надо)
Значение этого типа может быть пустым - в ToString() должно вернуться String.Empty
Для этого в некоторых ситуациях создавал объект, пихая в поле Double Double.NaN

Что не понимаю - как это значение может вообще получиться использовать практически.

В прочем, по моей теме давно понятно, что от Double надо уходить

Reply

1greywind September 28 2009, 07:49:54 UTC
В языках с динамической типизацией NaN используется для провеки операций, в которых может быть получен нечисловой результат.

Например в JS\AS при выполнении операции var a = Number("shut up") на выходе получится isNaN(a) = true, т.к. конвертнуть строку в число не получилось. И все дальнейшие попытки использовать это значение в операциях будут приводить к NaN результату. Эксепшен в данном случае не генерится.

В языках, где числовые значения не являются чистыми объектами (т.е. то, что называется "примитивные типы"), для проверки на инициализацию значения используется сравнение c undefined - если переменной не было присвоено значение, то там вместо значения или NaN будет undefined (а не null, как иногда ошибочно полагают).

Reply

1greywind September 28 2009, 07:51:59 UTC
И да, еще раз - напрямую с NaN ничего не сравнивают. Только через isNaN или его аналог. Т.к. один результат ошибочной конвертации вообще говоря не равен другому.

Reply


Leave a comment

Up