C++编译器能否采用射影无穷实现浮点数?
本问题灵感来自两个Stack Overflow问题:一个关于负无穷,另一个关于浮点数全序。
笔者认为,只要合理解读C++标准,当std::numeric_limits<float>::has_infinity为真时,-std::numeric_limits<float>::infinity()就保证有效,无论std::numeric_limits<float>::is_iec559是否为真。
但在针对负无穷问题发布支持该观点的答案前,需解决一个次要问题:能否以infinity == -infinity(射影空间中的运作方式)的方式实现带(负)无穷的float,同时保持合规性与实用性?
若-infinity不小于所有其他浮点数,便毫无用处。但如果infinity == -infinity,该值需同时大于和小于所有其他浮点数,这违背了实数的严格全序(无穷的比较无法满足传递性,否则毫无意义)。不过正如浮点数全序的问题所示,浮点数因NaN已偏离严格全序,但仍被视为全序类型。
标准中是否存在条款,禁止在-std::numeric_limits<float>::infinity() == std::numeric_limits<float>::infinity()的情况下,实现有意义的-std::numeric_limits<float>::infinity()?
无需多言,这种实现不会采用IEEE754/IEC559浮点数标准,不遵循该标准的实现会脱离标准的诸多约束。但此类实现极为罕见,因此需聚焦标准解读,而非现有编译器行为、逻辑判断或个人偏好。
内容的提问来源于stack exchange,提问作者Spencer

