【发布时间】:2013-02-01 21:25:19
【问题描述】:
我正在将 CUDA 代码移植到 C++ 并使用 Visual Studio 2010。CUDA 代码使用 rint 函数,该函数似乎不存在于 Visual Studio 2010 math.h 中,所以我似乎需要自己实现。
根据这个link,CUDA rint函数
以浮点格式将 x 舍入为最接近的整数值,中途情况舍入为零。
我想我可以使用转换为 int 来丢弃小数部分,有效地向零舍入,所以我最终得到了以下函数
inline double rint(double x)
{
int temp; temp = (x >= 0. ? (int)(x + 0.5) : (int)(x - 0.5));
return (double)temp;
}
它有两种不同的类型,一种是int,一种是double。
我有三个问题:
- 对于“小”数字,上述函数是否完全等同于 CUDA
rint?对于无法表示为int的“大”数字,它会失败吗? - 定义
rint是否有任何计算效率更高的方法(而不是使用两个转换)?
非常感谢您。
【问题讨论】:
-
我怀疑你需要强制转换为 int,而且它很容易出错。改用地板/天花板?
-
您的问题已经得到解答,njuffa 的回答可能是最好的
rint()实现,但我应该指出+ 0.5版本存在更多问题,而不仅仅是@987654334 的溢出@ 不能表示为int的参数。使用严格的 IEEE 754 编译器,0.49999999999999994 和 2^52 和 2^53 之间的一半数字的答案是不正确的。请参阅blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1(对于float,解释很容易翻译成double)。 -
如果您的计算机上的 int 是 32 位,则上述实现对于大于 2^31 的数字将失败。使用 int64_t 代替 int 会有所帮助,但当 x 是大双精度(大于 2^63)时仍然会出现问题。
标签: c++ visual-studio-2010 cuda