Вопрос

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

Foo: NaN encoutered at Foo.c:624

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

Редактировать:Точность:Я работаю с GCC под Linux.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

Да!Настройте (возможно, более или менее переносимо) ваш процессор, совместимый с IEEE 754, на генерацию прерывания при обнаружении NaN или infinite.

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

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

<Ол>
  • Для этого требуется каждый расчет с плавающей точкой. Огромное влияние на производительность.
  • NaN и Inf не являются злом. Они могут быть законно использованы в какой-то библиотеке, используемой вашим приложением, и нарушать ее.
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top