(这必须是重复的,但我找不到重复...)
如何正确比较 along long
和double
C++ 中的 a?
将任何一个转换为另一个可能会导致精度损失并可能溢出,所以我不确定该怎么做......
老实说:在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 long
s 进行比较。否则,您可以转换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