use*_*087 1 c++ c++11 c++-chrono
如果我达到使用的整数的限制(当前在我的实现中long long),我要么丢失第一个或最后一个数字,这取决于首先完成的内容(乘法或除法).查看我的实现乘法首先完成,所以我丢失了第一个数字.我的问题是,它是在某处(草案中最好的)首先定义的是什么?
实现就像(缩短版):
count * num / den;
Run Code Online (Sandbox Code Playgroud)
boost的实现是一样的.
N3797有这个说法std::ratio:
N3797 [20.11.4] [ratio.arithmetic]
2如果无法用intmax_t表示U或V,则程序格式错误.否则,实现应该产生U和V的正确值.如果不能用intmax_t表示X或Y,则程序是不正确的,除非实现产生正确的U和V值.
然后给出以下内容:
// The following cases may cause the program to be ill-formed under some implementations
static_assert(ratio_add<ratio<1,INT_MAX>, ratio<1,INT_MAX>>::num == 2,
"1/MAX+1/MAX == 2/MAX");
static_assert(ratio_add<ratio<1,INT_MAX>, ratio<1,INT_MAX>>::den == INT_MAX,
"1/MAX+1/MAX == 2/MAX");
static_assert(ratio_multiply<ratio<1,INT_MAX>, ratio<INT_MAX,2>>::num == 1,
"1/MAX * MAX/2 == 1/2");
static_assert(ratio_multiply<ratio<1,INT_MAX>, ratio<INT_MAX,2>>::den == 2,
"1/MAX * MAX/2 == 1/2");
Run Code Online (Sandbox Code Playgroud)
这似乎在我看来,如果你的程序在中间计算中溢出分母或分子,程序就会形成错误.