Есть ли веская причина для AS3 не выдавать исключение при попытке работать с NaN? - PullRequest
2 голосов
/ 25 декабря 2011

Когда допустима операция с переменной NaN?Я бы сказал, никогда.

Тем не менее, в AS3 не выдается исключение, и по умолчанию возвращается 0 при попытке операции с такой переменной.

Почему AS3 не выдает здесь исключение?

Ответы [ 3 ]

6 голосов
/ 25 декабря 2011

Нет исключения в AS3 при работе с NaN, потому что AS3 - это диалект ECMAScript , который, в свою очередь, реализует IEEE 754 , который определяет поведение NaN,Этот стандарт реализован на множестве языков и архитектур, включая те, которые не имеют надежной обработки исключений.NaN представляет способ выражения этих значений без каких-либо исключений, способом, который хорошо понят и задокументирован на множестве платформ и языков.

Если бы это не было реализовано против стандарта, то я хотел бы поспорить, что здесь будут люди, спрашивающие: «Почему AS3 генерирует исключение, а не возвращает NaN, как любая другая реализация с плавающей запятой IEEE 754?»делает?! "

См." Что должен знать каждый компьютерный специалист об арифметике с плавающей запятой ..."для быстрого обзора математики с плавающей запятой и NaN в целом и проверкииз википедии о NaN , и вы увидите, что на самом деле существует два типа NaN, определенных стандартом.Тихий NaN и сигнальный NaN.

Когда допустима операция с переменной NaN?Я бы сказал, никогда.

Без обид, не думаю, что вы в лучшем положении, чтобы сделать это абсолютное заявление, потому что, честно говоря, многие люди намного умнее вас в своихПрофессия подумала об этом и не пришла к такому же выводу.

2 голосов
/ 25 декабря 2011

Скорее всего это для оптимизации.Если Flash должен проверять каждое значение во время выполнения, любая математическая операция будет очень медленной.Когда есть вероятность, что значением может быть NaN, вам просто нужно проверить его самостоятельно, используя isNaN.

0 голосов
/ 25 декабря 2011

Это не ошибка.

Флэш-память int и uint по умолчанию равна 0.

Попробуйте все эти варианты:

var scale:Number;
var resultINT:int = undefined; // still 0 in the output;
var resultNUMBER:Number; // is NaN;
var resultUINT:uint;// sezo by default

trace ( this, scale, resultINT, resultNUMBER, resultUINT );
...