В нижеприведенном фрагменте кода я получаю исключение с плавающей запятой во время выполнения. Я считаю, что исключение происходит на линии, где выполняется деление на r. Когда я прокомментирую эту строку, я не получаю ошибок.Исключение от странной с плавающей запятой
Также очень странно, когда я скомпилирован в gcc с флагом «-g» (чтобы попытаться отладить) ИЛИ, если я вставляю некоторые «инструкции cout» сразу после «if statement», тогда я не получаю никаких плавающих точечное исключение во время выполнения.
Я смотрел на свой экран по этому коду в течение нескольких часов, возможно, я делаю какую-то глупую ошибку. Пожалуйста, помогите!
double prev;
for(int i=0;i<320;i++)
for(int j=0;j<320;j++)
{
double x = -8 + i*0.05;
double y = -8 + j*0.05;
r= sqrt(x*x+y*y);
double kappa = atanh( (2*r)/(2 + r*r) );
if(fabs(r) > 1e-7)
{
prev= (x*sinh(kappa))/r;
}
else
{
prev=0;
}
/* more stuff */
}
UPDATE: Так что я был в состоянии решить эту проблему путем добавления 1e-15 в знаменатель на спорной линии ..
prev= (x*sinh(kappa))/(r+1e-15);
Я до сих пор не знает, почему, если условие дает истинное .. для if (fabs (r)> 1e-7) при r = 0;
может ли это исключение переполнения? я имею в виду, что 'sinh' _does_ растет как O (e^x) –
спасибо за этот комментарий .. Я заменил эту строку просто prev = 1/r ... и все той же ошибкой. – physicist