Изменение режима округления с плавающей запятой

Каков наиболее эффективный способ изменения режима округления * чисел с плавающей запятой IEEE 754? Портативная функция C будет приятной, но решение, использующее сборку x86, тоже в порядке.

* Я имею в виду стандартные режимы округления к ближайшему, к нулю и к положительной / отрицательной бесконечности

Это стандартное решение C:

#include  #pragma STDC FENV_ACCESS ON // store the original rounding mode const int originalRounding = fegetround( ); // establish the desired rounding mode fesetround(FE_TOWARDZERO); // do whatever you need to do ... // ... and restore the original mode afterwards fesetround(originalRounding); 

На задних платформах, где отсутствует поддержка C99, вам, возможно, придется прибегать к сборке. В этом случае вы можете установить округление для блока x87 (через команду fldcw ) и SSE (через инструкцию ldmxcsr ).

Редактировать Вам не нужно прибегать к сборке для MSVC. Вместо этого вы можете использовать (полностью нестандартный) _control_fp( ) :

 unsigned int originalRounding = _control_fp(0, 0); _control_fp(_RC_CHOP, _MCW_RC); // do something ... _control_fp(originalRounding, _MCW_RC); 

Вы можете больше узнать о _control_fp () в MSDN .

И, просто для полноты, кольцо декодера для имен макросов для режимов округления:

 rounding mode C name MSVC name ----------------------------------------- to nearest FE_TONEAREST _RC_NEAR toward zero FE_TOWARDZERO _RC_CHOP to +infinity FE_UPWARD _RC_UP to -infinity FE_DOWNWARD _RC_DOWN 

это может помочь.

Изменить: я бы сказал, что вам нужна ваша собственная функция. Вы можете использовать сборку внутри C.

Но если вы зарегистрируете размер 64 бит, округлите его до 32 бит, сделайте ваши вычисления быстрее. Это на самом деле сделает его медленнее. Помните, что 64-битные вычисления просты для 64-х микропроцессоров, а не 2-32 бит. Я не знаю, чего именно вы хотите достичь. Я знаю, что производительность зависит от ваших критериев.

  • Печать чисел с плавающей запятой из x86-64, по-видимому, требует сохранения% rbp
  • Как напечатать двойное значение с полной точностью с помощью cout?
  • Принудительное использование плавающей запятой в .NET?
  • Как представить номер FLOAT в памяти на C
  • Представление целых чисел в двухместных
  • Является ли математика с плавающей запятой в C #? Может ли так быть?
  • плавать до неожиданного поведения
  • Проблема с поплавком на C
  • Каково обоснование для всех сравнений, возвращающих false для значений NaN IEEE754?
  • round () для float в C ++
  • Как числа с плавающей запятой сохраняются в памяти?
  • Давайте будем гением компьютера.