我正在编写一个应用程序,它使用十进制数进行大量操作(例如,57.65)。由于乘法和除法很快会削弱它们的准确性,我想将数字存储在一个在操作后保持其准确性的类中,而不是依靠浮点数和双倍。
我指的是这样的事情:
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中似乎不存在这种情况)。
有人知道这样的图书馆吗?非常感谢。
发布于 2009-08-12 19:28:10
你是说像这样的事吗?
#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;
}您可以在尾数中指定机器单词的数量以及您喜欢的指数。我已经使用TTMath来解决欧拉项目的难题,我对此感到非常高兴。我认为它是相对稳定的,如果你有问题的话,作者是非常友好的。
编辑::我过去也使用过MAPM。它代表基数100中的大浮点数,因此将十进制数字转换为基数100没有问题,这与基数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,它是TTMath的端口;)对我来说,我发现TTMath比我所尝试的更令人愉悦、更容易/更快,因为库在不触及堆的情况下进行堆栈分配。基本上,它不是一个任意的精度库,您可以在编译时指定精度,如上面所示。
发布于 2009-08-12 19:10:27
有一个库这里的列表。
我从来没有尝试过其中任何一个,所以我不能推荐一个,但是这一个是GNU项目的一部分,所以它不可能一半坏。
发布于 2009-08-12 19:20:54
如果你想自己玩,二进制编码十进制可能是你最好的选择。
https://stackoverflow.com/questions/1268072
复制相似问题