C++备忘录021:“不可比较”的nan

mac2025-05-06  17

std::set<double> s; s.insert(0.0/0.0); s.insert(3.0); std::cout << s.size() << '\n';

先在集合中压入一个0.0/0.0,然后在压入一个3.0,接着打印集合的大小,输出是

1

WTF?

0.0/0.0在C++中不是未定义行为,它的结果是nan(not a number),std::set默认使用std::less做比较运算,当!less(a, b) && !less(b, a)的时候,认为两值相等,不会插入到集合中

const auto l = std::less<double>{}; constexpr auto nan = std::numeric_limits<double>::quiet_NaN(); std::cout << l(nan, 3.0) << ' ' << l(3.0, nan) << '\n';

而C++规定,nan和任何数的比较都是false,以上的代码输出0 0

所以,当试图向集合中加入nan的时候,程序表现会非常“奇怪“

最新回复(0)