2015-11-17 4 views
0

В нижеприведенном фрагменте кода я получаю исключение с плавающей запятой во время выполнения. Я считаю, что исключение происходит на линии, где выполняется деление на 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;

+1

может ли это исключение переполнения? я имею в виду, что 'sinh' _does_ растет как O (e^x) –

+0

спасибо за этот комментарий .. Я заменил эту строку просто prev = 1/r ... и все той же ошибкой. – physicist

ответ

0

Sqrt отрицательного числа? попробуйте

r= sqrt(fabs(x*x+y*y)); 

в строке 7 вашего фрагмента.

+1

x * x + y * y гарантированно будет 0 или положительным – physicist

+0

'отрицательный', умноженный на' negative' положителен. 'положительный', умноженный на' положительный', '' положительный'. Любое число, помноженное на себя, будет «положительным». Итак, какое число при умножении на себя даст «отрицательный»? – alvits

+0

https://en.wikipedia.org/wiki/Signed_zero? – kpie

Смежные вопросы