И C 1999, и текущий C стандарт определяют средства для установки режима округления с плавающей запятой. Однако не все реализации C их поддерживают. В реализациях, которые это делают, следующий код сохранит предыдущий режим округления, выполнит операции с округлением до отрицательной бесконечности и восстановит предыдущий режим округления:
// Declare identifiers for accessing floating-point environment.
#include <fenv.h>
void foo(void *data)
{
// Inform compiler this code accesses the floating-point environment.
#pragma STDC FENV_ACCESS ON
// Save caller's rounding mode.
int PreviousRoundingMode = fegetround();
// Set desired rounding mode.
if (fesetround(FE_DOWNWARD) != 0)
{
// fesetround failed. Handle error.
}
// Insert here code to perform desired operations.
// Restore previous rounding mode.
fesetround(PreviousRoundingMode);
}
}
Обратите внимание, что basi c operations, можно ожидать, что такие как +
, *
, -
, /
и fma
будут соответствовать режиму округления, но функции математической библиотеки, такие как sin
или log
, могут не соответствовать.