c++ - 在 C++ 中使用不同的 IEEE 浮点舍入模式

标签 c++ rounding ieee-754 idioms

不幸的是我,我必须确保在 GPU 和 CPU 上获得相同的浮点结果。好的,我知道 IEEE 已经照顾我并提供了一个很好的标准来遵守几个舍入选项;并且 CUDA 部分被整理出来(有不同舍入模式的内在函数),所以这只是动机。

但是在主机端 C++ 代码中——我如何在特定的舍入模式下执行浮点运算(我的意思是在特定的语句中,而不是在我的翻译单元中)?是否有在引擎盖下使用程序集的包装函数?是否有一组具有不同舍入模式的 float 代理类?

我也在问关于翻译单元级别的相同问题。编译翻译单元时,如何使编译器(gcc/clang/MSVC)默认为某种舍入模式?

最佳答案

在@AndreasPapadopoulos 的引导下,它看起来像 there is an official way更改舍入模式:

int fesetround(int round)
int fegetround()

但有几个注意事项:

  1. 这是 C++11,而不是 C++98(尽管实际上您可能只使用系统的 <fenv.h>,即 C99。
  2. 它需要通过 #pragma 与编译器通信的
  3. 这种切换可能会很慢。

我不确定它在实践中的使用有多广泛(以及是否有更常用的围绕它的更好的抽象)。

关于c++ - 在 C++ 中使用不同的 IEEE 浮点舍入模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202713/

相关文章:

c++ - RunStandardAlert 永远不会返回,按钮无响应

c++ - 如何在 C++ 中以浮点/ double 值表示无穷大?

c - 整数表示到 float 表示

.net - 如何在 .Net 中将小数四舍五入到小数点后两位?

java - 具有长值的 Math.round/Divide 问题

php - 在 PHP 中将 64 位十六进制转换为 float

c++ - 为什么 C++ 共享指针的行为不像迭代器的标准指针?

c++ - QLibraryInfo 似乎没有加载 qt.conf

c++ - 当基类没有虚拟析构函数时为空子类 - 删除基指针的不利影响?

javascript - javascript 将浮点四舍五入到小数点后两位,但向下舍入