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

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

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

2 ответа

Решение

Это стандартное решение 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. Вы можете использовать (совершенно нестандартно) _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-разрядных. Я не знаю, чего именно ты хочешь достичь. Я знаю, что производительность по вашим критериям.

Другие вопросы по тегам