NaN
がuncomparableであるため、比較対象アルゴリズムはNaN
の値を含むデータでは正しく動作しません。 Inf
および-Inf
は比較可能であり、比較を実行する推力またはC++標準ライブラリアルゴリズムで動作します。
ここでの唯一の解決策は、まず、(thrust::remove_if
はisnan
を使用ファンクタまたはラムダ式で、このために使用することができる)NaN
値を削除し、データ上の比較に基づくアルゴリズムを実行することです。したがって、このような何か:
次ん
#include <iostream>
#include <thrust/remove.h>
#include <thrust/unique.h>
#include <thrust/sort.h>
int main()
{
const int N=18;
unsigned int data[N] = {
0x3e99999a, 0x7f800000, 0xff800000, 0x7fffffff, 0x3e4ccccd, 0x3dcccccd,
0x3e99999a, 0x7f800000, 0xff800000, 0x7fffffff, 0x3e4ccccd, 0x3dcccccd,
0x3e99999a, 0x7f800000, 0xff800000, 0x7fffffff, 0x3e4ccccd, 0x3dcccccd };
float* input = reinterpret_cast<float*>(&data[0]);
{
std::cout << "Input" << std::endl;
auto it = input;
for(; it != input+N; ++it) { std::cout << *it << std::endl; }
std::cout << std::endl;
}
auto pred = [](const float& v){ return isnan(v); };
auto input_end = thrust::remove_if(input, input+N, pred);
thrust::sort(input, input_end);
input_end = thrust::unique(input, input_end);
{
std::cout << "Output" << std::endl;
auto it = input;
for(; it != input_end; ++it) {std::cout << *it << std::endl; }
std::cout << std::endl;
}
return 0;
}
:NaN
エントリが削除された場合に
~/SO$ nvcc --std=c++11 -arch=sm_52 inf_nan.cu
~/SO$ ./a.out
Input
0.3
inf
-inf
nan
0.2
0.1
0.3
inf
-inf
nan
0.2
0.1
0.3
inf
-inf
nan
0.2
0.1
Output
-inf
0.1
0.2
0.3
inf
が一意の値をソートし、抽出する完全に可能であるが、入力されたデータにInf
と-Inf
が含まれます。
IEEE754のNaN値をソートすることは不可能です。(定義上)NaNは比較できないためです。標準のC++比較演算子(およびその推力相当)は、NaNを他の数またはそれ自身と比較することはできません。 – talonmies