【发布时间】:2018-10-30 12:25:59
【问题描述】:
我正在用 intel 内部函数编写一些代码并这样做:
#include <iostream>
#include <xmmintrin.h>
float data[4];
__m128 val1 = _mm_set_ps1(2);
__m128 val2 = _mm_set_ps1(1);
val1 = _mm_cmpgt_ps(val1, val2);
_mm_store_ps(data, val1);
std::cout << std::hex << data[0];
我试图在 SSE 内在函数(即 -nan)中获取“真”的十六进制值,但每当我尝试打印 -nan 的十六进制值时,只会将 -nan 作为“十六进制值”。
我也尝试过使用 std::oct 和 std::dec ,但它们都不起作用。
我还尝试比较不同组合的 0xFFFFFFFF 和 data[0] 并得到:
float data[4];
__m128 val1 = _mm_set_ps1(2);
__m128 val2 = _mm_set_ps1(1);
val1 = _mm_cmpgt_ps(val1, val2);
_mm_store_ps(data, val1);
float f = 0xFFFFFFFF;
float g = 0xFFFFFFFF;
std::cout << std::dec << (data[0] == f) << "\n"; // Prints "0"
std::cout << std::dec << (data[0] == data[0]) << "\n"; // Prints "0"
std::cout << std::dec << (f == g); // Prints "1"
有什么方法可以打印出 -nan 的十六进制值,如果没有,谁能告诉我 -nan 的二进制、十六进制等值?
【问题讨论】:
-
生成安静的 NaN。返回 double 类型的安静 NaN(非数字)值。 NaN 值用于标识浮点元素的未定义或不可表示的值,例如负数的平方根或 0/0 的结果。
-
不是数字的东西(你知道“nan”代表“不是数字”吗?)怎么会有价值?它可能有一个实现定义的值,但这真的超出了我认为的重点。
-
32 位浮点比较的结果是 0xFFFFFFFF 或 0,以启用用作掩码。这也是偶然的-nan。您是只对值感兴趣,还是特别对用代码打印它感兴趣?
-
@4386427 虽然存在这样的值,但它并不是 C++ 标准的一部分,因此不可移植。当一个人可以(而且应该!)使用
std::isnan时,真的没有理由依赖它。特别是考虑到可能有多个可能的值代表nan或-nan。 -
@Someprogrammerdude 哦,我并不想说它是 C++ 标准的一部分。它是特定系统上使用的浮点标准的一部分。无论如何,关键是 NaN 有(至少)一个可以打印的二进制模式。
标签: c++ floating-point nan