2

(这必须是重复的,但我找不到重复...)
如何正确比较 along longdoubleC++ 中的 a?

将任何一个转换为另一个可能会导致精度损失并可能溢出,所以我不确定该怎么做......

4

1 回答 1

4

老实说:在s 具有 64 位有效位long double的平台上使用 a。long double

如果您想处理没有此类支持的平台:

我将假设 along long是 64-bit 并且 adouble是通常的 IEEE 64-bit double

如果d >= 0x1.0p63,那么你long long的小于它。如果d < -0x1.0p63,那么你long long的大于它。如果d != d,则比较应该返回false,因为d是 NaN。如果fabs(d) >= 0x1.0p53,d表示一个整数,那么您可以转换d为slong long并与long longs 进行比较。否则,您可以转换ll为sdouble并进行比较double;如果任何低位丢失,则它们与比较无关。

代码(未编译和未经测试):

#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
于 2014-06-22T02:54:54.590 回答