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