Определен ли порядок вычисления std :: ratio в std :: chrono :: duration?

Если я достигну предела используемого целого числа (в настоящее время на моей реализации long long) Я либо теряю первую или последнюю цифру, в зависимости от того, что сделано первым (умножение или деление). Сначала я изучаю умножение реализации, поэтому я теряю первые цифры. У меня вопрос, определено ли это где-то (лучше всего в проекте), что делается первым?

редактировать:

реализация похожа (укороченная версия):

count * num / den;

Реализация Boost такая же.

1

Решение

N3797 имеет это сказать на std::ratio:

N3797 [20.11.4] [коэффициент.арифметика]

2 Если невозможно представить U или V с помощью intmax_t, программа некорректна. В противном случае реализация должна давать правильные значения U и V. Если невозможно представить X или Y с помощью intmax_t,
программа некорректна, если реализация не дает правильных значений 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");

Мне кажется, это говорит о том, что если ваша программа переполнит либо знаменатель, либо числитель при промежуточных вычислениях, программа будет некорректной.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]