【发布时间】:2015-07-05 08:27:24
【问题描述】:
假设我有两个对象i 和f,分别是I 和F。我知道std::is_integral<I>::value 是真的,std::is_floating_point<F>::value 是真的。
是否有一种完全符合标准的方法来确定i 的值是否小于f 的值?请注意对“完全符合标准”的强调,对于这个问题,我只对由 C++ 标准保证支持的答案感兴趣。
简单的实现i < I(f) 不起作用,因为f 的值可能不适合i。简单的实现F(i) < f 也不起作用,因为f 的精度可能不足以表示i,导致i 被四舍五入到等于f 的值(如果你有IEEE754 浮点数, 16777219 < 16777220.f 失败)。
但真正的困境来了:如果你想使用std::numeric_limits::max 来缓解这些问题,你就回到了比较浮点数和整数的原始问题!这是因为std::numeric_limits::max的类型和原来的类型是一样的。
【问题讨论】:
-
这个问题的要求“我只对由 C++ 标准保证支持的答案感兴趣”对于这个问题来说是不合理和愚蠢的。这类似于寻求一种实现冒泡排序的方法,并要求答案得到 C++ 标准的支持。 C++ 标准对冒泡排序没有任何规定。
-
i < f是一种“符合标准”的方式来确定i是否小于f。 -
@Cheersandhth.-Alf 我不同意。问题的全部意义在于找到一种在任何 C++ 实现上都定义良好的方法。您可以为冒泡排序执行此操作,但我不确定您是否可以进行此比较,因此是我的问题。
-
@Barry 然而,我的问题中的反例却失败了——所以这显然是不对的。
-
@orlp:不确定您是否理解您的要求。例如你知道标准支持十进制浮点表示吗?你想要那个覆盖吗?您是否知道标准(很可能是一次事故)不需要对称整数范围?你想要那个覆盖吗?你知道标准甚至没有定义例如乘法?你想要那个覆盖吗?简而言之,“在任何 [exant] C++ 实现上都定义良好的方法”与正式保证之间有很长的距离。
标签: c++ floating-point integer comparison language-lawyer