我正在编写一个应用程序,它可以进行大量操作decimal数字(例如 57.65)。由于乘法和除法很快会侵蚀它们的准确性,我想将数字存储在一个类中,以便在操作后保留它们的准确性,而不是依赖于 float 和 double。
我正在谈论这样的事情:
class FloatingPointNumber {
private:
long m_mantissa;
int m_dps; // decimal points
// so for example 57.65 would be represented as m_mantissa=5765, m_dps=2
public:
// Overloaded function for addition
FloatingPointNumber operator+(FloatingPointNumber n);
// Other operator overloads follow
}
虽然我可以编写这样一个类,但感觉有点像重新发明轮子,而且我确信一定有某个库类可以做到这一点(尽管这在 STL 中似乎不存在)。
有人知道这样的图书馆吗?非常感谢。
你的意思是这样的吗?
#include "ttmath/ttmath.h"
#include <iostream>
int main()
{
// bigdouble consists of 1024*4 bytes for the mantissa
// and 256*4 bytes for the exponent.
// This is because my machine is 32-bit!
typedef ttmath::Big<1024, 256> bigdouble; // <Mantissa, Exponent>
bigdouble x = 5.05544;
bigdouble y = "54145454.15484854120248541841854158417";
bigdouble z = x * y * 0.01;
std::cout << z;
return 0;
}
您可以指定数量机器字 in the mantissa和exponent随你便。
我用过TTMath http://www.ttmath.org/ttmath解决欧拉计划难题,我对此非常满意。我认为它比较稳定,如果你有问题,作者也很友善。
EDIT::我也用过MAPM http://www.tc.umn.edu/~ringx004/mapm-main.html在过去。它代表大的浮点数base 100,因此与基数 2 不同,将十进制数转换为基数 100 不会有问题。TTMAT 使用基数 2 来表示大浮点数。正如图书馆页面声称的那样,它自 2000 年以来一直稳定。正如您在库页面中看到的那样,它已在许多应用程序中使用。它是一个带有漂亮 C++ 包装器的 C 库。
MAPM nextPrime(){
static MAPM prime = 3;
MAPM retPrime = prime;
prime += 2;
while( isPrime( prime ) == false )
prime += 2;
return retPrime;
}
顺便说一句,如果您对 GMP 感兴趣并且正在使用 VS,那么您可以检查MPIR http://www.mpir.org/这是 Windows 的 GMP 端口;)对我来说,我发现 TTMath 比我尝试过的所有方法都更令人愉悦,而且更容易/更快,因为该库在不接触堆的情况下进行堆栈分配。基本上它不是一个任意精度的库,您可以在编译时指定精度,如上所示。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)