2015-12-08 3 views
0

Я пытаюсь проверить свои операции с плавающей запятой в c99.Проверка уравнения с плавающей точкой ansi c - isnormal()

Должен ли я выполнять все мои операции внутри isnormal()? Имеет ли смысл этот код?

double dTest1 = 0.0; 
double dTest2 = 0.0; 
double dOutput = 0.0; 

dTest1 = 5.0; 
dTest2 = 10.3; 
dOutput = dTest1 * dTest2; 

//add some logic based on output 
isnormal(dOutput); 

ответ

2

Использование isnormal не похоже на что-либо идиоматическое. Я не уверен, что вы ожидаете именно от использования isnormal таким образом (это, очевидно, будет верно для 5.0*10.3, я бы ожидал, что компилятор будет его оптимизировать так), но здесь есть хотя бы некоторые очевидные проблемы, предполагающие, что вы используете его для других вычислений:

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

isnormal не сообщит вам, было ли ваше вычисление настолько близким к нулю, что оно потеряло точность (субнормальный диапазон) и позже вернулось в нормальный диапазон.

Возможно, вам лучше обслуживать исключения FPU: есть одно для каждого возможного события, для которого вы, возможно, захотите узнать, произошло ли это с момента начала ваших вычислений, а способ их использования нарисован в this existing answer.

+0

У моего компилятора нет исключений FPU. Должен ли я использовать другую проверку ошибок в зависимости от типа операции с плавающей запятой? Если я думаю, что большое количество будет разделено на небольшое число, я должен проверить, недостаточно ли? если я умножу два больших числа, я должен проверить переполнение? – CodeSlapper

+0

@CodeSlapper Для одного умножения значений, которые, как вам известно, не равны нулю, использование 'isnormal' в результате отлично проверяет правильность точности результата. Но это дорого: 'isnormal', вероятно, стоит больше, чем само умножение. Причина, по которой я рекомендовал исключения, заключается в том, что вы можете проверить их только в конце длинной последовательности операций и определить, что все операции, рассчитанные в соответствии с планом, более читабельны и более эффективны. –