如何比较长型和双精度型

How to compare a long long with a double?

本文关键字:长型 双精度型 比较 何比较      更新时间:2023-10-16

(这个是重复的,但是我找不到重复的…)
如何在c++中正确比较long longdouble ?

将其中一个转换为另一个可能会导致精度损失和可能溢出,所以我不确定该怎么办…

诚实地说:在long double有64位有效的平台上使用long double

如果你想处理没有这种支持的平台:

我将假设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