У меня есть код с возможными переполнениями с плавающей запятой, который не может быть проверен путем проверки аргументов функций. Я должен определить _matherr
и выбросить из него исключение, чтобы дать возможность вызывающей стороне справиться с проблемой.
Есть что-то странное: в сборке Debug _matherr вызывается так, как предполагается, но не в Release. Я использую CodeGear C ++ Builder 2007. Под MSVC 2010 обработчик работает нормально, но мне нужны функции VCL для всего приложения. Поиск в Google ничего не дает, кроме сообщений о том, что _matherr
не работает в DLL (что известно из документации).
И мой вопрос: что может быть причиной того, что _matherr
не работает в Release?
// One of the methods with overflows.
double DoubleExponential::F(double x) const
{
try
{
double y=pow(fabs(x),a);
return 0.5 + sign(x)*G(y,1/a)/(2*G(1/a));
}
catch(PowExpOverflow)
{
return 0.5;
}
}
// Exception.
struct PowExpOverflow {};
int _matherr (struct _exception *a){
Application->MessageBox("Inside custom _matherr", "", MB_OK);
if (a->type == OVERFLOW)
if (!strcmp(a->name,"pow") ||
!strcmp(a->name,"powl") ||
!strcmp(a->name,"exp") ||
!strcmp(a->name,"expl"))
{
throw PowExpOverflow();
}
return 0;
}