C++中的所有對象都有一個類型。 d_max
的類型是double
。 d_max + 1.1
的類型仍然是雙倍的。如果d_max
是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
時,操作結果也是double
- 如前所述,d_max + 1
的值不能用double
表示,因此選擇最接近的可表示值(d_max
)。然後將該值分配給ld
。
請注意,這不太可能通過確保運算符產生long double
(可能與d_max + 1.0L
)得到解決。在如此巨大的數字(大約10^308
帶有IEEE 754表示)時,加1將不會將您移動到long double
中的下一個可表示值。我的執行,我要補充10 (也就是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
更精確。唯一的保證是它不具有精度較低的。
目前還不清楚你在這裏期待什麼。如果'd_max'是'double'的最大值,那麼你不會得到比它高的任何東西。 – 2013-02-23 14:05:52
最大... <在這裏插入Inigo Montoya報價> – 2013-02-23 14:07:05
是不是可以比較一個double的最高值與另一個沒有type的值? – bottus 2013-02-23 14:07:53