如果我达到使用的整数的限制(当前在我的实现long long
上),我会丢失第一个或最后一个数字,具体取决于首先完成的内容(乘法或除法)。查看我的实现乘法首先完成,所以我丢失了第一个数字。我的问题是,它是在某处(草案中最好的)首先定义的是什么?
实现就像(缩短版本):
count * num / den;
boost的实现是一样的。
答案 0 :(得分:6)
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");
在我看来,如果你的程序在中间计算中溢出分母或分子,那么程序是不正确的。