Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

#include <fenv.h>
#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. Вместо этого вы можете использовать (совершенно нестандартный) _controlfp( ):

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

Вы можете прочитать больше о _controlfp() на 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

Ответ 2

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

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

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