Перерыв на NaNs или Infs - PullRequest
       31

Перерыв на NaNs или Infs

2 голосов
/ 27 ноября 2009

Часто трудно найти происхождение NaN, так как это может произойти на любом этапе вычисления и распространиться само по себе. Так возможно ли остановить программу на C ++, когда вычисления возвращают NaN или inf? На мой взгляд, лучше всего иметь сбой с хорошим сообщением об ошибке:

Foo: NaN encoutered at Foo.c:624

Возможно ли что-то подобное? У вас есть лучшее решение? Как вы решаете проблемы с NaN?

РЕДАКТИРОВАТЬ: Точность: я работаю с GCC под Linux.

Ответы [ 3 ]

6 голосов
/ 27 ноября 2009

Вы не можете сделать это полностью переносимым способом, но многие платформы предоставляют C API, которые позволяют вам получать доступ к регистрам (ам) управления состоянием с плавающей запятой.

В частности, вы хотите снять маску с переполнения и недопустимых исключений с плавающей запятой, которые заставят процессор сигнализировать об исключении, когда арифметика в вашей программе дает NaN или бесконечность.

В вашей системе Linux это должно сработать:

#include <fenv.h> 
...
feenableexcept(FE_INVALID | FE_OVERFLOW);

Возможно, вы захотите научиться писать обработчик ловушек, чтобы вы могли распечатать диагностическое сообщение или иным образом продолжить выполнение, когда сигнализируется одно из этих исключений.

1 голос
/ 27 ноября 2009

Да! Установите (возможно, более или менее переносимый) ваш процессор, совместимый с IEEE 754, для генерации прерывания, когда встречается NaN или бесконечность.

Я гуглил и нашел эти слайды , которые являются началом. На слайде на странице 5 собрана вся необходимая информация.

0 голосов
/ 27 ноября 2009

Я не эксперт по Си, но я ожидаю, что ответ - нет.

  1. Для этого потребуется каждый расчет с плавающей точкой. Огромное влияние на производительность.
  2. NaN и Inf не являются злом. Они могут быть законно использованы в какой-то библиотеке, используемой вашим приложением, и нарушать ее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...