CUDA的 nan函数中的额外指针参数到底起到什么作用?
提供静默NaN的 CUDA函数是:
__device__ double nan(const char *tagp)
文档写着:
参数
tagp选择可能的表示之一。
我的问题是:这是什么意思?有哪些不同的可能表示形式,以及 tagp 取哪些值,才能得到它们?
解决方案
这是在C 和C++中也使用的完全相同的参数。参见:
(见cppreference.com。)
需要额外参数的原因在于,浮点值的许多位模式被解释为一个(静默的) NaN:唯一的约束是指数必须是全1。因此,对于一个 double 值,静默NaN实际上将尾数的整个位(去掉最高位)作为一个“有效载荷”(另见 IEEE 754为什么要保留这么多NaN值?)。由于(相当奇怪的)C传统,载荷通过一个字符串来指定。
- 如果字符串是由数字、拉丁字母和下划线组成的序列,那么
nan("XXXX")等价于调用strtod("NANXXXX", nullptr)。 - 具体来说,调用
nan("")等价于调用strtod("NAN()", nullptr) - 对于任何不符合上述字符序列定义的字符串,调用nan("string"),其中string既不属于上述任何一种情况,相当于调用
strtod("NAN", nullptr)。
因此,例如,nan("12ab") 将产生一个 double 值,其指数全为1,尾数为 0x12ab(符号位为0)。
感谢 @SteveSummit。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。