(这个有是重复的,但是我找不到重复的…)
如何在c++中正确比较long long
与double
?
将其中一个转换为另一个可能会导致精度损失和可能溢出,所以我不确定该怎么办…
诚实地说:在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