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

use*_*087 1 c++ c++11 c++-chrono

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

编辑:

实现就像(缩短版):

count * num / den;
Run Code Online (Sandbox Code Playgroud)

boost的实现是一样的.

Sir*_*Guy 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");
Run Code Online (Sandbox Code Playgroud)

这似乎在我看来,如果你的程序在中间计算中溢出分母或分子,程序就会形成错误.