gpt4 book ai didi

c++ - C++20 中是否有一个 float 包装器,可以让我默认飞船运算符?

转载 作者:行者123 更新时间:2023-12-02 07:15:20 26 4
gpt4 key购买 nike

我正在观看“使用 C++20 三路比较 - Jonathan Müller - Meeting C++ 2019”演讲,其中提到了包含浮点成员的类的问题。

问题源于这样一个事实:涉及 NaN 的 IEEE 754 比较很奇怪,并且不提供总排序。Talk 提供了解决此问题的方法,例如使用 strong_order或者在实现 <=> 时手动忽略 NaN 值(假设值永远不是 NaN)。

我的问题是,是否有一些库包装器可以让我说“我保证”我的 float 永远不会是 NaN ,这会对 float 进行缓慢但有效的比较(更慢但更安全)因为 NaN 现在是有序的)。我的目标是通过使成员漂浮宇宙飞船友好来避免手动实现宇宙飞船(这样我就可以默认宇宙飞船)。

使用演讲中的示例:

// original class
struct Temperature{
double value;
};

struct TemperatureNoNan{
std::a_number<double> value; // I promise value will never be NaN
// Now spaceship defaulting works
};

struct TemperatureStrongO{
std::s_ordered<double> value; // I want strong ordering(2 diff NaNs are not the same)
// Now spaceship defaulting works
};

最佳答案

"I promise" that my floats are never NaN

template <std::floating_point T>
struct NeverNaN {
T val;
constexpr NeverNaN(T val) : val(val) { }
constexpr operator T() const { return val; }

constexpr bool operator==(NeverNaN const&) const = default;

constexpr std::strong_ordering operator<=>(NeverNaN const& rhs) const {
auto c = val <=> rhs.val;
assert(c != std::partial_ordering::unordered);
return c > 0 ? std::strong_ordering::greater :
c < 0 ? std::strong_ordering::less :
std::strong_ordering::equal;
}
};

不幸的是,没有什么好方法可以“提升”这样的比较类别。而且目前优化还不是很好。

that would do slow but valid comparisons on floats(slower but safer since NaNs are now ordered)

此函数通过 std::strong_order()std::weak_order() 提供特定的库支持 [cmp.alg]取决于您想要什么样的比较:

template <std::floating_point T>
struct TotallyOrdered {
T val;
constexpr TotallyOrdered(T val) : val(val) { }
constexpr operator T() const { return val; }

// depends on whether or not you want == NaN to still be false?
// might need to be: return (*this <=> rhs) == 0;
constexpr bool operator==(TotallyOrdered const&) const = default;

constexpr auto operator<=>(TotallyOrdered const& rhs) const {
return std::strong_order(val, rhs.val);
// ... or std::weak_order(val, rhs.val)
}
};

关于c++ - C++20 中是否有一个 float 包装器,可以让我默认飞船运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59445206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com