У меня есть две дроби, которые я люблю сравнивать. Они хранятся так:
struct fraction {
int64_t numerator;
int64_t denominator;
};
В настоящее время я сравниваю их так:
bool fraction_le(struct fraction a, struct fraction b)
{
return a.numerator * b.denominator < b.numerator * a.denominator;
}
Это работает нормально, за исключением того, что (64 bit value) * (64 bit value) = (128 bit value)
означает, что будет переполнение для числителей и знаменателей, которые слишком далеки от нуля.
Как сделать так, чтобы сравнение работало всегда, даже для абсурдных дробей?
Да, и кстати: дроби всегда хранятся упрощенно, и только числитель может быть отрицательным. Может быть, это входное ограничение делает возможным какой-то алгоритм...