Использование isnormal
не похоже на что-либо идиоматическое. Я не уверен, что вы ожидаете именно от использования isnormal
таким образом (это, очевидно, будет верно для 5.0*10.3
, я бы ожидал, что компилятор будет его оптимизировать так), но здесь есть хотя бы некоторые очевидные проблемы, предполагающие, что вы используете его для других вычислений:
Zero не является нормальным, поэтому вы не должны использовать isnormal
в качестве проверки на работоспособность для результата, который может быть равен нулю.
isnormal
не сообщит вам, было ли ваше вычисление настолько близким к нулю, что оно потеряло точность (субнормальный диапазон) и позже вернулось в нормальный диапазон.
Возможно, вам лучше обслуживать исключения FPU: есть одно для каждого возможного события, для которого вы, возможно, захотите узнать, произошло ли это с момента начала ваших вычислений, а способ их использования нарисован в this existing answer.
У моего компилятора нет исключений FPU. Должен ли я использовать другую проверку ошибок в зависимости от типа операции с плавающей запятой? Если я думаю, что большое количество будет разделено на небольшое число, я должен проверить, недостаточно ли? если я умножу два больших числа, я должен проверить переполнение? – CodeSlapper
@CodeSlapper Для одного умножения значений, которые, как вам известно, не равны нулю, использование 'isnormal' в результате отлично проверяет правильность точности результата. Но это дорого: 'isnormal', вероятно, стоит больше, чем само умножение. Причина, по которой я рекомендовал исключения, заключается в том, что вы можете проверить их только в конце длинной последовательности операций и определить, что все операции, рассчитанные в соответствии с планом, более читабельны и более эффективны. –