是否定义了std :: chrono :: duration中的std :: ratio计算顺序?

时间:2014-04-07 15:43:41

标签: c++ c++11 chrono

如果我达到使用的整数的限制(当前在我的实现long long上),我会丢失第一个或最后一个数字,具体取决于首先完成的内容(乘法或除法)。查看我的实现乘法首先完成,所以我丢失了第一个数字。我的问题是,它是在某处(草案中最好的)首先定义的是什么?

编辑:

实现就像(缩短版本):

count * num / den;

boost的实现是一样的。

1 个答案:

答案 0 :(得分:6)

N3797std::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");

在我看来,如果你的程序在中间计算中溢出分母或分子,那么程序是不正确的。