Изменить режим округления с плавающей запятой - PullRequest
38 голосов
/ 29 июля 2011

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

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

Ответы [ 2 ]

37 голосов
/ 29 июля 2011

Это стандартное решение 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
0 голосов
/ 29 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...