Переполнение против Inf

Когда я ввожу число больше максимального double в Matlab, это примерно 1.79769e+308, для пример 10^309, он возвращает Inf. В образовательных целях я хочу получить исключение переполнения, например компиляторы C, которые возвращают сообщение об ошибке переполнения, а не Inf. Мои вопросы:

  1. Inf исключение переполнения?

  2. Если да, то почему компиляторы C не возвращают Inf?

  3. Если нет, могу ли я получить исключение переполнения в Matlab?

  4. Есть ли вообще разница между Inf и исключением переполнения?

Также я не хочу проверять Inf в Matlab, а затем генерировать исключение с функцией error().


person Dante    schedule 27.10.2014    source источник
comment
@lakesh Что ты имеешь в виду?   -  person Dante    schedule 27.10.2014
comment
@lakesh Я не хочу рассчитывать. Также 1e^309 неверен. Я думаю, вы имеете в виду это 10^309=1.0e309.   -  person Dante    schedule 27.10.2014
comment
почему ты хочешь сделать это? Что не так с проверкой Inf и выдачей исключения?   -  person David    schedule 27.10.2014
comment
@ Дэвид Я хочу сделать это просто для обучения. Я хочу знать, в чем разница между исключением переполнения и Inf;)   -  person Dante    schedule 27.10.2014
comment
Это актуальный и интересный вопрос. Те, кто голосует "против" или голосуют за закрытие, должны прочитать , как спецификация с плавающей запятой работает с бесконечностью и переполнение. Обычно они смешиваются, как в Matlab, но это не одно и то же.   -  person horchler    schedule 27.10.2014
comment
Я тоже не понимаю голосов против. Это совершенно правильный вопрос, и мне это действительно интересно!   -  person rayryeng    schedule 28.10.2014


Ответы (3)


1) Плавающие точки в C / C ++

Операции с числами с плавающей запятой могут давать результаты, не являющиеся числовыми значениями. Примеры:

  • результат операции - комплексное число (подумайте sqrt(-1.0))
  • результат операции не определен (подумайте 1.0 / 0.0)
  • результат операции слишком велик, чтобы его можно было представить
  • выполняется операция, когда один из операндов уже равен NaN или Inf

Философия IEEE754 - не перехватывать такие исключения по умолчанию, но для создания специальных значений (Inf и NaN) и разрешения продолжения вычислений в обычном режиме без прерывания программы . Пользователь должен проверять такие результаты и обрабатывать их отдельно (как функции isinf и isnan в MATLAB).

Существует два типа значений NaN: NaN ( Quiet NaN) и sNaN (сигнализация NaN). Обычно все арифметические операции с числами с плавающей запятой производят тихий тип (а не тип сигнализации), когда операция не может быть успешно завершена.

Существуют (зависящие от платформы) функции для управления средой с плавающей запятой и catch Исключения FP:

Например, посмотрите, как Python реализует модуль управления исключениями FP для разных платформ: https://hg.python.org/cpython/file/tip/Modules/fpectlmodule.c

2) Целые числа в C / C ++

Это, очевидно, полностью отличается от чисел с плавающей запятой, поскольку целочисленные типы не могут представлять Inf или NaN:

  • Беззнаковые целые числа используют модульную арифметику (поэтому значения меняются, если результат превышает наибольшее целое число). Это означает, что результат беззнаковой арифметической операции всегда «математически определен» и никогда не выходит за пределы допустимого. Сравните это с MATLAB, который использует арифметику насыщения для целых чисел (uint8(200) + uint8(200) будет uint8(255)).
  • с другой стороны, переполнение целого числа со знаком - это неопределенное поведение.
  • целое деление на ноль является неопределенным поведением.
person Amro    schedule 28.10.2014

Плавающая точка

MATLAB реализует IEEE Standard 754 для операций с плавающей запятой. В этом стандарте есть пять определенных исключений:

  1. Недействительная операция
  2. Деление на ноль
  3. Переполнение
  4. Недополнение
  5. Неточный

Как отмечено в библиотеке GNU C эти исключения обозначаются словом состояния, но не завершают программу. Вместо этого возвращается значение по умолчанию, зависящее от исключения; значение может быть фактическим числом или специальным значением. Специальными значениями в MATLAB являются Inf, -Inf, NaN и -0; эти символы MATLAB используются вместо зарезервированных двоичных представлений официального стандарта для удобства чтения и использования (немного приятного синтаксического сахара). Операции со специальными значениями четко определены и работают интуитивно.

Имея эту информацию в руках, ответы на вопросы таковы:

  1. Inf означает, что была выполнена операция, вызвавшая одно из указанных выше исключений (а именно, 1, 2 или 3), и Inf было определено как возвращаемое значение по умолчанию.

  2. В зависимости от того, как написана программа C, какой компилятор используется и какое оборудование присутствует, _ 8_ и NaN - специальные значения, которые могут быть возвращены операцией C. Это зависит от того, если и как был реализован стандарт IEEE-754. C99 имеет реализацию IEEE-754 как часть стандарта, но в конечном итоге компилятор должен решать, как работает реализация (это может быть осложнено агрессивной оптимизацией и стандартными параметрами, такими как режимы округления).

  3. Возвращаемое значение Inf или -Inf указывает, что исключение переполнения могло иметь место, но это также может быть недопустимая операция или деление на ноль. Я не думаю, что MATLAB скажет вам, что это такое (хотя, возможно, у вас есть доступ к этой информации через скомпилированные файлы MEX, но я с ними не знаком).

  4. См. Ответ 1.

Чтобы получить более интересные и подробные примеры, вот хороший PDF-файл.


Целые числа

Целые числа не ведут себя так, как указано выше в MATLAB. Если операция с целым числом указанного размера в битах превысит максимальное значение этого класса, оно будет установлено на максимальное значение и наоборот для отрицательных значений (если они подписаны). Другими словами, целые числа MATLAB не переносятся.

person TroyHaskin    schedule 27.10.2014

Я собираюсь повторить ответ Ян Саймон с веб-сайта "Ответы MATLAB":

Для остановки (в режиме отладчика) при делении на ноль используйте:

warning on MATLAB:divideByZero
dbstop if warning MATLAB:divideByZero

Аналогично для остановки логарифмирования нуля:

warning on MATLAB:log:LogOfZero
dbstop if warning MATLAB:log:LogOfZero

и для остановки, когда операция (вызов функции или присвоение) возвращает NaN или Inf, используйте:

dbstop if naninf

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

error_warning_handling_dialog1error_warning_handling_dialog2

person Amro    schedule 28.10.2014
comment
Также см. Этот вопрос и ответы и этот сообщение из недокументированного Matlab об обнаружении предупреждений. - person horchler; 28.10.2014