Как сравнить длинный длинный с двойным?

(Это имеет быть дубликатом, но я не могу найти дубликат …)
Как правильно сравнить long long с double в С ++?

Приведение одного к другому может привести к потере точности и, возможно, к переполнению, поэтому я не уверен, что делать …

2

Решение

Честно говоря: использовать long double на платформе, где long doubleУ них есть 64-битное значение.

Если вы хотите работать с платформами без такой поддержки:

Я собираюсь взять на себя long long 64-битный и double это обычный IEEE 64-битный double,

Если d >= 0x1.0p63тогда ваш long long меньше чем это. Если d < -0x1.0p63тогда ваш long long больше, чем это. Если d != dсравнение должно вернуться false так как d является NaN. Если fabs(d) >= 0x1.0p53, d представляет собой целое число, поэтому вы можете конвертировать d в long long и сделайте свое сравнение с long longs. В противном случае вы можете конвертировать ll в double и сделайте свое сравнение с doubles; если потеряны какие-либо младшие биты, они не имеют отношения к сравнению.

Код (не скомпилированный и не проверенный):

#define COMPAR(a, b) ((a) < (b) ? -1 : (a) == (b) ? 0 : 1)
int compar(long long a, double b) {
if (b != b) return false;
if (b >= 0x1.0p63) return -1;
if (b < -0x1.0p63) return 1;
if (fabs(b) >= 0x1.0p53) return COMPAR(a, (long long)b);
else return COMPAR((double)a, b);
}
#undef COMPAR
3

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


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