Функция FENV_ACCESS
, предоставляемая C и C ++, является кладжем и не поддерживает использование, используемое в этом вопросе.Программы, которые изменяют режим округления, редки, и языковая поддержка для них плохая.
В соответствии со стандартом C (и унаследованным C ++ по ссылке), FENV_ACCESS
информирует о реализации, которую программа может запускать в нестандартных режимах управления с плавающей запятой.Если вы разрешаете вызывать вашу функцию exp
в режиме, отличном от режима по умолчанию, и она не переводится при включенном FENV_ACCESS
, стандарты не сообщают нам, как это будет происходить.
Далее, C ++не предоставляет никаких средств для автоматического вызова различных версий подпрограммы в зависимости от режима округления или состояния FENV_ACCESS
(хотя реализации C ++ могут сделать это как расширение языка).
утверждение, на которое вы ссылаетесь из cppreference о том, что режим округления не влияет на арифметические операции в константных выражениях, похоже, является выводом, полученным из cppreference, а не чем-то явно выраженным в стандарте C ++.Возможно, это следует из того факта, что константные выражения оцениваются во время перевода, поэтому никакие модификации среды с плавающей запятой не могли быть выполнены.Однако мне не ясно, что это полностью гарантировано стандартом - в примечании в разделе expr.const говорится, что «константные выражения можно оценивать во время перевода». В нем не говорится, что они должны оцениваться во время перевода.
Как правило, не хотелось бы, чтобы exp
вел себя так же, когда режим округления ближайший к ближайшему, как когда он приближается к бесконечности или другой настройке.Вместо этого хотелось бы, чтобы exp
возвращал результат округления в большую сторону, когда режим находится в направлении к бесконечности, округлен в меньшую сторону, когда режим находится в направлении к отрицательной бесконечности, и округлен до нуля, когда режим приближается к нулю.(Для получения этих результатов требуются разные реализации exp
для каждого режима, поскольку простое применение округления к каждой операции не приведет к требуемому результату.) Таким образом, ваш запрос exp
возвращает один и тот же результат независимо от режима округлениянемного необычно.С какой целью он возвращает округленный до ближайшего результата, когда программа оценивает операции с плавающей запятой в другом режиме округления?Если программа использует бесконечность, чтобы попытаться вычислить верхнюю границу, ближайший exp
нарушит это вычисление.