В данном случае речь идёт о вещественных числах. Насколько я понял FPU входит в CPU. И существует два режима работы FPU:
1. С генерацией исключений (который вроде как по-умолчанию);
2. Без генерации исключений с константами типа INF(1.0/0.0) и NaN(0.0/0.0);
Последний режим действительно работает быстрее, как сообщается в Embarcadero RAD Studio Help:
Цитата:
When using OpenGL to render 3D graphics, we recommend that you disable all floating-point exceptions for performance reasons. To do this, call Set8087CW(0x133f) in...
Set8087CW задаёт контрольное слово (control word) FPU, которое задаёт маску исключений FPU при работе с вещественными числами. В общем попробовал. Работает:
#include <stdio.h>
#include <conio.h>
#include <System.hpp>
#include <Math.hpp>
void GetDouble(const char *text, double *pValue)
{
printf(text);
scanf("%lf", pValue);
fflush(stdin);
}
//-----------------------------------------------------------------------------
int main()
{
double a, b, c;
Set8087CW(0x133F);
//получаем данные
GetDouble("a= ", &a);
GetDouble("b= ", &b);
//расчет
c = a / b;
//вывод данных
if (IsInfinite(c))
printf("Infinite result\n");
else if (IsNan(c))
printf("Not a number\n");
else
printf("c= %G\n", c);
printf("Press any key to exit...");
_getch();
return 0;
}
//-----------------------------------------------------------------------------
-- Ср июл 23, 2014 17:08:10 --Справедливости ради, стоит отметить, что под Windows многие компиляторы реализуют так называемую структурную обработку исключений (SEH - structure exception handling), которая хорошо описана у Назара и Рихтера. Поэтому на С++ ошибки можно обрабатывать с помощью SEH:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
void GetDouble(const char *text, double *pValue)
{
printf(text);
scanf("%lf", pValue);
fflush(stdin);
}
//-----------------------------------------------------------------------------
int main()
{
double a, b, c;
bool calced = false;
//получаем данные
GetDouble("a= ", &a);
GetDouble("b= ", &b);
//расчет
__try
{
c = a / b;
calced = true;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("MATH ERROR.\n");
}
//вывод данных
if (calced)
printf("c= %G\n", c);+
printf("Press any key to exit...");
_getch();
return 0;
}
//-----------------------------------------------------------------------------
Таким образом есть два взаимоисключающих варианта обработки мат. ошибок:
1. Использование SEH;
2. Использование сравнения на INF, NaN (для этого надо настроить FPU, чтобы он не выбрасывал исключений).
Что лучше?