Цель состоит в том, чтобы поднять исключения.Когда вход в floor
является сигнальным NaN, подпрограмма должна вызвать плавающую точку недопустимая операция исключение. 1 Вместо вызова некоторой подпрограммы, которая будет делать это путем манипулирования битами врегистр состояния с плавающей точкой, проще оценить x+x
, так как добавление сигнального NaN к себе (или чему-либо еще) вызовет недопустимую операцию исключение.
Это довольнораспространенный в реализациях программ математической библиотеки.Для другого примера рассмотрим sin(x)
.Для очень маленьких значений x
, sin(x)
настолько близко к x
, что x
является ближайшим значением, представимым в формате с плавающей запятой, поэтому возвращаемое значение должно быть x
.Но точный математический грех x не совсем x
(если x
не равен нулю), поэтому должно возникать исключение неточное .Для этого процедура может вернуть, например, x + x*x
.Если x
очень мало (но не равно нулю), это будет равняться x
, но вызовет исключение недопустимое .
Обратите внимание на дополнительное преимущество в этом случае: Когда x
равен нулю, x + x*x
не вызывает исключение неточное .Таким образом, выражение служит как для нулевого, так и для очень малого ненулевого случая.Таким образом, он заменяет не только ручное создание исключения, но также и ветвление в зависимости от того, равен x
ноль или нет.Это не редкость в этих выражениях;они являются эффективным способом реализации функции.
Сноска
1 Исключения с плавающей точкой не являются исключениями C ++.Как они обрабатываются, зависит от настроек среды с плавающей запятой.Чаще всего они просто поднимают флаги, которые программа может позже проверить.Но они также могут вызывать ловушки, которые изменяют выполнение программы, например исключения C ++.