6 c++ comparison numeric c++11
在编写几个数学实用程序时,我遇到需要实现可以在任何两个基本算术类型之间进行比较的通用实用程序.当我开始编码时,很明显这个操作并不像看起来那么简单,因为我需要正确处理边角情况,特别是当类型具有不同的精度时,即在类型之间转换期间的舍入策略变得很重要.考虑:
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
Run Code Online (Sandbox Code Playgroud)
以上可以使用c ++ 0x类型特征来实现,以根据提供给比较函数的模板参数自动选择适当的算法.然而,这是非常复杂的,并且有很多地方可以出现bug,所以我不认为自己发明一切是值得的.有谁知道正确实现上述的库?
您可能想查看 GNU 的 MP Bignum 库,网址为http://gmplib.org/。从他们的页面:
GMP 是一个用于任意精度算术的免费库,可对有符号整数、有理数和浮点数进行运算。除了运行 GMP 的机器中的可用内存所暗示的精度之外,精度没有实际限制。GMP有丰富的函数集,并且函数有规范的接口。
GMP 经过精心设计,无论是对于小操作数还是大操作数,都尽可能快。该速度是通过使用全字作为基本算术类型、使用快速算法、针对许多 CPU 的最常见内部循环使用高度优化的汇编代码以及普遍强调速度来实现的。