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
。唯一的保证是它的精度不会降低。