(Это имеет быть дубликатом, но я не могу найти дубликат …)
Как правильно сравнить long long
с double
в С ++?
Приведение одного к другому может привести к потере точности и, возможно, к переполнению, поэтому я не уверен, что делать …
Честно говоря: использовать 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 long
s. В противном случае вы можете конвертировать ll
в double
и сделайте свое сравнение с double
s; если потеряны какие-либо младшие биты, они не имеют отношения к сравнению.
Код (не скомпилированный и не проверенный):
#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