Visual Studio 2010 math.h 中不存在 rint 以及 CUDA rint 的等效项

2023-12-01

我正在将 CUDA 代码移植到 C++ 并使用 Visual Studio 2010。CUDA 代码使用rint函数,该函数似乎不存在于Visual Studio 2010 math.h中,所以看来我需要自己实现它。

根据这个link、CUDArint功能

将 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.

我有三个问题:

  1. 上述功能是否完全等价于CUDArint对于“小”数字?对于无法表示为的“大”数字,它会失败吗?int?
  2. 是否有任何计算效率更高的方法(而不是使用两个铸造)来定义rint?

预先非常感谢您。


CUDA 文档中引用的 rint() 描述不正确。具有浮点结果的舍入到整数映射 IEEE-754 (2008) 指定的舍入模式,如下所示:

trunc()   // round towards zero
floor()   // round down (towards negative infinity)
ceil()    // round up (towards positive infinity)
rint()    // round to nearest or even (i.e. ties are rounded to even)
round()   // round to nearest, ties away from zero

一般来说,这些函数按照 C99 标准中的描述工作。对于 rint(),标准指定函数根据当前舍入模式进行舍入(默认舍入到最接近或偶数)。由于 CUDA 不支持动态舍入模式,因此定义为使用当前舍入模式的所有函数都使用舍入模式“舍入到最接近或偶数”。以下是一些示例,显示了 round() 和 rint() 之间的区别:

argument  rint()  round()
1.5       2.0     2.0
2.5       2.0     3.0
3.5       4.0     4.0
4.5       4.0     5.0

round() 可以很容易地沿着您发布的代码行进行模拟,我不知道 rint() 的简单模拟。请注意,您不希望使用中间转换为整数,因为“int”支持的数字范围比“double”精确表示的整数窄。相反,请酌情使用 trunc()、ceil()、floor()。

由于 rint() 是当前 C 和 C++ 标准的一部分,因此我对 MSVC 不包含此函数感到有点惊讶;我建议检查 MSDN,看看是否提供替代品。如果您的平台支持 SSE4,则可以使用 SSE 内在函数_mm_round_sd(), _mm_round_pd()定义于smmintrin.h,舍入模式设置为_MM_FROUND_TO_NEAREST_INT,实现CUDA的rint()功能。

虽然(根据我的经验),SSE 内在函数可以跨 Windows、Linux 和 Mac OS X 移植,但您可能希望避免特定于硬件的代码。在这种情况下,您可以尝试以下代码(经过轻微测试):

double my_rint(double a)
{
    const double two_to_52 = 4.5035996273704960e+15;
    double fa = fabs(a);
    double r = two_to_52 + fa;
    if (fa >= two_to_52) {
        r = a;
    } else {
        r = r - two_to_52;
        r = _copysign(r, a);
    }
    return r;
}

请注意,MSVC 2010 似乎也缺少标准的 copysign() 函数,因此我必须替换 _copysign()。上面的代码假设当前的舍入模式是舍入到最近的偶数(默认情况下)。通过添加 2**52,可以确保在整数单位位处进行舍入。请注意,这还假设执行纯双精度计算。在对中间结果使用更高精度的平台上,可能需要将“fa”和“r”声明为易失性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Visual Studio 2010 math.h 中不存在 rint 以及 CUDA rint 的等效项 的相关文章

随机推荐

  • 将 `.klib` 库添加到 kotlin 多平台

    我想知道如何将我的 cinterop ted 库导入到 kotlin 多平台构建的 gradle 构建中 我已经创建了library def文件并填充它 我还生成了library klib以及随之而来的文件夹 我只是不明白如何将其导入到gr
  • 名称为 char[] 的变量

    如何在 C 中使用 char 表中指定的名称创建变量 就像是 char name gets name int name 0 我希望你明白我的意思 C 与您可能习惯的 Python 或 Ruby 等脚本语言不同 C 是编译而不是解释的 在运行
  • 使用replaceall输出错误

    为什么我从以下代码中得到 AAAAAAAAA 而不是 1A234A567 String myst 1 234 567 String test myst replaceAll A System out println test 任何想法 尝试
  • Android 文档中没有关于 RecyclerView 和 StaggeredGridLayoutManager 的好例子

    我找不到更好的使用示例RecyclerView with StaggeredGridLayoutManager 甚至不在安卓文档 Q1 我需要一些例子来正确解释如何使用RecyclerView with StaggeredGridLayou
  • Integer.class 和 Integer.TYPE 之间的区别[重复]

    这个问题在这里已经有答案了 这两者有什么区别 原始类型不能有 类 可以吗 它是原始类型 没有对象可以有类 这两者有什么区别呢 我不确定你的意思 但是 AClass对象是类型的运行时代表 也就是说 有这样的事情int class这不同于Int
  • 为什么 sbt 在设置 $JAVA_HOME 时报告“未检测到 java 安装”?

    我有 2 个 sbt android scala 项目 第一个是单个的 ls al drwxr xr x 13 alex staff 442 Dec 24 20 44 drwxr xr x 4 alex staff 136 Dec 24 2
  • JMS 消耗多个主题

    我是 Java 新手 正在开发一个使用多个 不同 主题并将其发送到另一台服务器的项目 我想知道处理多个主题的最佳方法是什么 据我了解 每个消费者都与一个主题相关 因此 如果我必须使用多个主题 则每个不同的主题都需要一个消费者 由于消费者进行
  • 如何修复一些 Xcode 13 错误,例如无法正确跳转到定义?

    我最近更新到 Xcode 13 突然 显示代码操作 中的选项不再起作用 这包括 跳转到定义 显示快速帮助 甚至突出显示所有使用某些规范的地方 有人遇到同样的问题或有解决办法吗 我已经尝试关闭应用程序 重新启动计算机 清理构建文件夹 但没有任
  • 在 Javascript 中将所有复选框值作为数组传递

    我有以下复选框 我需要将它们作为数组值获取
  • 防止弹性项目超过父级高度并使滚动条工作

    如何防止子div带有滚动条和flex 1超过 Firefox 中其父级 Flexbox 的高度 它在 Chrome 中工作正常 CodePen 链接 如果您更喜欢它而不是 Stack Overflow 片段 https codepen io
  • 在循环中追加到字典值列表

    我有一些代码 其中使用名称列表和结果文件 最终是多个文件 团队 名称 地点 我正在寻找的最终结果是将每个人的姓名 键 与点 值 列表相关联 但是 当我使用下面的代码时 我最终得到的结果如下 Abe 100 80 90 Bob 100 80
  • $_ 的奇怪值/行为

    输出应该是aaabbbcccdddeee not aaa555234dddeee perl wle map for my i 2 i lt 5 i push a a e print a aaa555234dddeee 仅在引用 取消引用时的
  • 如何异步等待 x 秒然后执行某些操作?

    我知道有Thread Sleep and System Windows Forms Timer and Monitor Wait在 C 和 Windows 窗体中 我似乎无法弄清楚如何等待 X 秒然后做其他事情 而不锁定线程 我有一个带有按
  • 如何在 python 中上传 FTP 上的完整目录? [复制]

    这个问题在这里已经有答案了 我必须在 FTP 服务器上上传一个目录 其中包含子目录和文件 但我似乎无法正确理解 我想按原样上传目录 及其子目录和文件所在的位置 ftp FTP ftp connect host port ftp login
  • hibernate中如何删除连接表中的记录

    论坛会员 我需要你们所有人的帮助 我有两个具有一对多关系的 POJO 模型 我的项目 pojo 如下 Entity Table name project public class Project implements java io Ser
  • 将文件存储在 HDFS 上的命令

    介绍 一个 Hadoop NameNode 和三个 DataNode 已安装并正在运行 下一步是向 HDFS 提供文件 已执行以下命令 hadoop fs copyFromLocal ubuntu 14 04 desktop amd64 i
  • 如何检测访问我的网站所使用的浏览器?

    如何检测用户正在使用什么浏览器 IE Firefox Opera 访问我的网站 Javascript PHP ASP Python JSP 以及您能想到的任何其他语言的示例都会有所帮助 是否有一种与语言无关的方法来获取此信息 如果是为了处理
  • Vim 的替代命令可以像 sed 的“t labe”一样处理递归模式吗?

    只是一个随机的例子 aaa 01 02 03 04 05 aaa 后面的数字个数不固定 替换后的预期结果是 aaa 01 aaa 02 aaa 03 aaa 04 aaa 05 我知道如何使用 sed 的 t label 或 Vim 使用类
  • 无法在 ubuntu 14.04 的终端内退出 emacs

    我在 ubuntu 14 04 上的终端中运行 emacs emacs nw 如果我尝试退出C x C c 我在底部的和弦空间中看到了这一点 C x 我是一个 Emacs 新手 但这看起来像是试图与c键 即使我将手指举过Ctrl钥匙 如果我
  • Visual Studio 2010 math.h 中不存在 rint 以及 CUDA rint 的等效项

    我正在将 CUDA 代码移植到 C 并使用 Visual Studio 2010 CUDA 代码使用rint函数 该函数似乎不存在于Visual Studio 2010 math h中 所以看来我需要自己实现它 根据这个link CUDAr