2009-03-06 1 views

ответ

8

Пожалуйста, проверьте http://linux.die.net/man/1/gcc есть опция компилятора -mcheck-zero-division, чтобы справиться с этим.

В качестве альтернативы, установка обработчика SIGFPE может быть вариант, Поплавок DIV на 0 будет затем генерировать «FPE_ZERODIVIDE»

  signal(SIGFPE, (fptr) FPE_ExceptionHandler); 

     void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/) 
      { 
       switch(nErrType) 
        { 
        case FPE_ZERODIVIDE: /* ??? */ break; 
       } 

      } 

так

системы Большинство с плавающей точкой основаны на стандарте IEEE , что позволяет делить на 0. Это возвращает либо положительную бесконечность, либо отрицательную бесконечность, если это необходимо, основываясь на знаках чисел. (За исключением 0/0 возвращает неопределенный NAN - опять же не исключительный случай.) Это, как правило, полезно для научных и математических приложений. NAN эффективно сигнализируют случай, когда расчеты не были pseible, но позволяют продолжить вычисления. Продолжающиеся вычисления не приведут к новым результатам, но будут продолжать возвращать НН. Это позволяет проводить длинные длинные цепочки вычислений без проверки ошибок в пределах калькуляции. Ошибка проверки должна выполняться только в самом конце работы. Это делает код намного проще и быстрее. Он также может быть более полезным иногда, как и для некоторых приложений, infintity - это «полезный» результат, а не действительно признак проблем.

+1

Обратите внимание, что опция -mcheck-zero-division специфична для архитектуры MIPS. Например. он не будет работать на x86. – janneb

+0

Да, вы правы, нам нужно пойти для обработчика SIGFPE .. – lakshmanaraj

3

Нет - исключение не выбрасывается (вы получаете сигнал - вероятно, SIGFPE). Вам нужно проверить возможное разделение на нули в вашем коде, а затем выбросить исключение самостоятельно,

3

Если это вообще вызывает ошибку во время выполнения (см. lakshmanaraj's nice discussion on IEEE maths, хотя какой-то компилятор позволит вам вводить ошибки вместо NaN) , он выдает исключение с плавающей запятой сигнал.

Сигналы - это другой механизм, чем исключения C++, и обрабатываются на уровне ОС. Есть уже целый ряд вопросов, касающихся SO механизма Никс сигнала *, в том числе:

Для окон, вы должны спросить кого-то другого. Mac OS X - это, конечно же, система, основанная на unix.

+0

У Windows есть свой собственный механизм под названием Structured Exception Handling, вы увидите его сокращенно как SEH: http://msdn.microsoft.com/en-us/library /ms680657(VS.85).aspx –

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