C++ 中的所有对象都有一个类型。的类型d_max是double。的类型d_max + 1.1仍然是double。如果d_max是 a 的最大值double,则d_max + 1.1不可表示,并且将使用最接近的可表示值,即d_max(但是,如果添加明显更大的值,则最接近的可表示值被认为是正无穷大)。所以你的std::max电话相当于:
std::max(d_max, d_max)
展示:
double d_max = std::numeric_limits<double>::max();
bool b = (d_max == (d_max + 1.1));
std::cout << std::boolalpha << b << std::endl;
这true作为输出给出。
为了回应您的评论,我假设您正在做这样的事情:
double d_max = std::numeric_limits<double>::max();
long double ld = d_max + 1;
std::cout << (d_max == ld) << std::endl;
d_max奇怪的是,你发现这显然ld是平等的。为什么?嗯d_max是一个double。当你这样做时d_max + 1,操作的结果也是 a double- 的值d_max + 1不能用 a 表示double,如前所述,因此选择最接近的可表示值 ( d_max)。然后将该值分配给ld。
long double请注意,仅通过确保运算符产生 a (可能带有)来解决此问题是不可能的d_max + 1.0L。对于如此庞大的数字(大约10^308使用 IEEE 754 表示),加 1 不会将您移动到 a 中的下一个可表示值long double。在我的实现中,我必须添加 10 289(即 1 后跟 289 个零)才能实际导致值发生变化:
double d_max = std::numeric_limits<double>::max();
long double ld = d_max + 1E289L;
std::cout << (d_max == ld) << std::endl;
此外,不能保证long double比 具有更高的精度double。唯一的保证是它的精度不会降低。