我有一个关于modf
的超载分辨率的问题。modf的过载分辨率
考虑下面的代码。
#include <iostream>
#include <iomanip>
#include <climits>
#include <cmath>
int main()
{
unsigned long ul = ULONG_MAX;
long double ipart;
long double fpart = std::modf(ul, &ipart);
std::cout << std::fixed << std::setprecision(0)
<< ul << ", " << ipart << ", " << fpart << '\n'
<< static_cast<double>(ul) << '\n';
}
在我的测试环境中,代码输出...
18446744073709551615, 18446744073709551615, 0
18446744073709551616
比照http://melpon.org/wandbox/permlink/7ZF2CwqEwBRU5hg4
C++ 14标准26.8 [c.math] P.11说,
此外,存在应足以确保附加重载:
如果任何算术参数对应到
double
参数的类型为long double
,则对应于double
参数的所有算术参数被有效地转换为long double
。否则,如果对应于
double
参数的任何算术参数的类型为double
或整数类型,则对应于double
参数所有算术 参数被有效地转换为double
。否则,对应于
double
参数的所有算术参数的类型为float
。
变量ul
没有类型long double
但整数类型,所以我觉得应该ul
被转换为 double
,然后ipart
应该是18446744073709551616
。 (也就是说,海湾合作委员会的行为是错误的。)
我对这种行为有误解吗? (当然,我认为海湾合作委员会的行为更可取。)
你正在调用'std :: modf'的long double变体,但是你的静态转换只能用'double'完成。 “所以我认为ul应该被翻倍”:你错了,'ul'被转换成'long double' –