AVX 允许按位逻辑运算,例如和/或浮点数据类型 __m256 和 __m256d。
但是,C++ 合理地不允许对浮点数和双精度数进行按位运算。如果我是对的,则无法保证浮点数的内部表示,编译器是否会使用 IEEE754,因此程序员无法确定浮点数的位会是什么样子。
考虑这个例子:
#include <immintrin.h>
#include <iostream>
#include <limits>
#include <cassert>
int main() {
float x[8] = {1,2,3,4,5,6,7,8};
float mask[8] = {-1,0,0,-1,0,-1,0,0};
float x_masked[8];
assert(std::numeric_limits<float>::is_iec559);
__m256 x_ = _mm256_load_ps(x);
__m256 mask_ = _mm256_load_ps(mask);
__m256 x_masked_ = _mm256_and_ps(x_,mask_);
_mm256_store_ps(x_masked,x_masked_);
for(int i = 0; i < 8; i++)
std::cout << x_masked[i] << " ";
return 0;
}
假设使用 IEEE754,因为 -1 的表示为 0xffffffff,我希望输出为
1,0,0,4,0,6,0,0
而相反
1 0 0 1.17549e-38 0 1.17549e-38 0 0
因此,我对内部表示的假设可能是错误的(或者我犯了一些愚蠢的错误)。
所以问题是:有没有一种方法可以使用浮点逻辑并且对结果有意义的事实是安全的?