更改浮点舍入模式
Change floating point rounding mode
改变IEEE 754浮点数舍入模式*的最有效方法是什么?一个可移植的C函数会很好,但是一个使用x86汇编的解决方案也是可以的。
*我指的是趋近、趋近零和趋近正无穷大/负无穷大的标准舍入模式
这是标准的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);
你可以在MSDN上阅读更多关于_controlfp()的信息。
并且,为了完整起见,为舍入模式的宏名称提供一个解码器环:
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位的计算比2-32位的计算更容易。我不知道你到底想达到什么目的。我知道业绩是你的标准。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 将整数舍入到另一个整数的最接近的倍数
- Sizeof 舍入到对齐方式,但编译器仍将对象放在剩余的字节中
- 避免将 Int 转换为双重类型转换舍入
- 浮点数学运算后舍入不一致
- 浮动到绳子而无需舍入
- 增强多精度舍入模式
- 在c++中使用不同的IEEE浮点舍入模式
- 更改浮点舍入模式