Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 任意算术类型的比较:有人知道实现吗?_C++_Comparison_C++11_Numeric - Fatal编程技术网

C++ 任意算术类型的比较:有人知道实现吗?

C++ 任意算术类型的比较:有人知道实现吗?,c++,comparison,c++11,numeric,C++,Comparison,C++11,Numeric,在编写几个数学实用程序时,我遇到了实现通用实用程序的需要,该实用程序可以在任意两种基本算术类型之间执行比较。当我开始编码时,很明显这个操作并不像看起来那么简单,因为我需要正确处理角点情况,特别是当类型具有不同的精度时,即在类型之间转换期间的舍入策略变得很重要。考虑: float a1 = 4.8f; int a2 = 4; assert(a2 != (int) a1); //fails erroneously since we truncated a1 float b1 = 40000000.

在编写几个数学实用程序时,我遇到了实现通用实用程序的需要,该实用程序可以在任意两种基本算术类型之间执行比较。当我开始编码时,很明显这个操作并不像看起来那么简单,因为我需要正确处理角点情况,特别是当类型具有不同的精度时,即在类型之间转换期间的舍入策略变得很重要。考虑:

float a1 = 4.8f;
int a2 = 4;
assert(a2 != (int) a1); //fails erroneously since we truncated a1

float b1 = 40000000.0f; //can represent only 40000000 and 40000004 accurately
long b2 = 40000002;
assert(b1 != (float) b2); //fails erroneously since we now truncated b2

可以使用c++0x type traits实现上述功能,以根据提供给比较函数的模板参数自动选择适当的算法。然而,这是相当复杂的,有相当多的地方可以爬虫子,所以我不认为自己发明一切都是值得的。有人知道一个正确实现上述功能的库吗?

您可能想查看GNU的MP Bignum库。从他们的页面:

GMP是一个免费的任意精度算法库,在 有符号整数、有理数和浮点数。那里 对精度没有实际限制,除非 运行GMP的机器中的可用内存。GMP有一套丰富的 函数,并且函数具有常规接口

GMP是经过精心设计的,以尽可能快的速度,无论是对于小型企业还是小型企业 操作数和,用于大型操作数。速度是通过使用 fullwords作为基本的算术类型,通过使用快速算法,具有 高度优化的汇编代码,适用于 大量的CPU,并普遍强调速度


您明确要求通过强制转换进行截断。如果不使用强制类型转换,则“较小”类型的参数将被“提升”,不会截断任何内容,断言将按预期传递。我不明白你想做什么。你可以先用
modf
@jons34yp检查浮点是否为整数:
40000000.0f
是否等于
40000002
,因为在任何实际情况下,整数值都在浮点值的误差范围内,这几乎是一个没有意义的问题。您可以将两者转换为用户定义的bigint类型(从GMP或任何地方),这将告诉您它们是否表示相同的值。或者,一个80位
长的double
足够精确地表示多达64位的整数,因此如果编译器允许您使用其中一个,它将作为一个通用类型。这就是x87使用这种大小的原因。即使对于整数类型,也很难做到这一点-例如将-1LL与大的正无符号long-long进行比较。boost numeric_cast的实现中有一些代码可以处理其中的一些问题,但我不确定它是否作为一种通用功能公开。不过还是值得一看。下面是一份委员会文件,其中涉及了整数类型的问题,使用了min和max(并包含一个实现):