(此 是重复的,但我找不到重复...)
如何在C ++中正确比较long long
和double
?
向对方施放会造成精度损失和可能溢出,所以我不知道该怎么做......
答案 0 :(得分:4)
老实说:在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
,则比较应返回fabs(d) >= 0x1.0p53
,因为d
是NaN。如果d
,long long
代表一个整数,那么您可以将long long
转换为ll
并与double
进行比较。否则,您可以将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
并与{{1}}进行比较;如果丢失了任何低位,它们与比较无关。
代码(未编译和未经测试):
{{1}}