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

C++ 是否定义了std::chrono::duration中的std::ratio计算顺序?,c++,c++11,chrono,C++,C++11,Chrono,如果我达到所用整数的极限(目前在我的实现中long),我会丢失第一个或最后一个数字,具体取决于首先执行的操作(乘法或除法)。在我的实现中,乘法是先完成的,所以我丢失了第一个数字。我的问题是,是否在某个地方(草案中最好的地方)定义了先做什么 编辑: 实现如下(简短版本): boost的实现是相同的。在std::ratio: N3797[20.11.4][比率.算术] 2如果无法用intmax_t表示U或V,则程序格式不正确。否则,实现应产生正确的U和V值。如果不能用intmax_t表示X或Y,则

如果我达到所用整数的极限(目前在我的实现中
long
),我会丢失第一个或最后一个数字,具体取决于首先执行的操作(乘法或除法)。在我的实现中,乘法是先完成的,所以我丢失了第一个数字。我的问题是,是否在某个地方(草案中最好的地方)定义了先做什么

编辑: 实现如下(简短版本):

boost的实现是相同的。

std::ratio
:

N3797[20.11.4][比率.算术]

2如果无法用intmax_t表示U或V,则程序格式不正确。否则,实现应产生正确的U和V值。如果不能用intmax_t表示X或Y,则 除非实现产生正确的U和V值,否则程序的格式不正确

然后给出以下内容:

//在某些实现中,以下情况可能会导致程序格式错误
静态断言(比率添加::num==2,
“1/MAX+1/MAX==2/MAX”);
静态断言(比率添加::den==INT\u MAX,
“1/MAX+1/MAX==2/MAX”);
静态断言(比率乘以::num==1,
“1/MAX*MAX/2==1/2”);
静态断言(比率乘以::den==2,
“1/MAX*MAX/2==1/2”);
在我看来,这似乎表明,如果您的程序在中间计算中会溢出分母或分子,则该程序的格式不正确。

std::ratio
上有这样的说法:

N3797[20.11.4][比率.算术]

2如果无法用intmax_t表示U或V,则程序格式不正确。否则,实现应产生正确的U和V值。如果不能用intmax_t表示X或Y,则 除非实现产生正确的U和V值,否则程序的格式不正确

然后给出以下内容:

//在某些实现中,以下情况可能会导致程序格式错误
静态断言(比率添加::num==2,
“1/MAX+1/MAX==2/MAX”);
静态断言(比率添加::den==INT\u MAX,
“1/MAX+1/MAX==2/MAX”);
静态断言(比率乘以::num==1,
“1/MAX*MAX/2==1/2”);
静态断言(比率乘以::den==2,
“1/MAX*MAX/2==1/2”);

在我看来,这似乎表明,如果您的程序在中间计算中会溢出分母或分子,则该程序的格式是错误的。

您是指在任何旧的算术表达式中?像
long-long a=b*c/d
?@GuyGreer-no,我的意思是
a=b*c/d
不同于
a=b/d*c
。除了计算结果溢出外,结果是相同的。
std::ratio
上的算术运算符顺序似乎没有具体定义。这意味着正常顺序适用,其中乘法和除法具有相同的优先级,并且从左到右求值。在您的示例中,乘法是在除法之前完成的。“其他任何事情都会让人困惑。”巴特凡尼罗普我理解得对吗?这意味着实现可以更改为
count/den*num
?您是指任何旧的算术表达式吗?像
long-long a=b*c/d
?@GuyGreer-no,我的意思是
a=b*c/d
不同于
a=b/d*c
。除了计算结果溢出外,结果是相同的。
std::ratio
上的算术运算符顺序似乎没有具体定义。这意味着正常顺序适用,其中乘法和除法具有相同的优先级,并且从左到右求值。在您的示例中,乘法是在除法之前完成的。“其他任何事情都会让人困惑。”巴特凡尼罗普我理解得对吗?这意味着实现可以更改为
count/den*num
count * num / den;