Если я достигну предела используемого целого числа (в настоящее время на моей реализации long long
) Я либо теряю первую или последнюю цифру, в зависимости от того, что сделано первым (умножение или деление). Сначала я изучаю умножение реализации, поэтому я теряю первые цифры. У меня вопрос, определено ли это где-то (лучше всего в проекте), что делается первым?
реализация похожа (укороченная версия):
count * num / den;
Реализация Boost такая же.
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");
Мне кажется, это говорит о том, что если ваша программа переполнит либо знаменатель, либо числитель при промежуточных вычислениях, программа будет некорректной.
Других решений пока нет …