2013-11-09 2 views
2

В libc для HP-UX есть функция fesetflushtozero для переключения поведения с плавающей точкой между «постепенным потоком» и «сбросом до нуля».Эквивалент fesetflushtozero() на разных Unices

Несмотря на расчесывание документации и справочных страниц нескольких файлов Unix libc (включая glibc), мне еще предстоит найти, как добиться того же самого в других Unices. Мне особенно интересны Linux/glibc, Solaris и AIX.

ответ

4

Как вы, несомненно, отметили, нет стандартного способа сделать это (в этом отношении стандартного определения «флеш-ноль» не существует, ни каких-либо требований, которые оно реализует). Таким образом, все средства для этого связаны с платформой. Для того, чтобы добавить немного больше к списку, так как это полезная ссылка:

  • OSX/Intel: fesetenv(_FE_DFL_DISABLE_SSE_DENORMS_ENV). Обратите внимание, что этот только эффекты арифметические сделаны в float или double, что делается с использованием SSE2 (отсюда и название); long double арифметика выполняется с использованием устаревших инструкций x87, которые не поддерживают промывку.

  • iOS/arm: в 32-битном ARM под iOS режим по умолчанию - режим по умолчанию. Вы можете повернуть его с для инструкций VFP (но не для NEON), очистив бит __fpscr_flush_to_zero в объекте fenv_t и установив эту среду с помощью fesetenv().

  • iOS/arm64: fesetenv(_FE_DFL_DISABLE_DENORMS_ENV).

1

Мне интересно, почему C99/UNIX стандарт функция fesetround(FE_TOWARDZERO) не подходит для вас - это то же самое на всех этих платформах, включая HP/UX.

платформозависимость, у вас есть:

Не удалось найти что-либо для AIX, кроме fesetround() a с.

+4

округло-нулевой и флеш-ноль имеют совершенно другую семантику. –

+0

Спасибо за функцию Solaris, которая делает то, что мне нужно ... но я думаю, что остальная часть вашего ответа смущает режим округления и flush-to-zero –

Смежные вопросы