我正在编写一个应用程序,它使用十进制数字(例如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中)。
有人知道这样的图书馆吗?非常感谢。
答案 0 :(得分:5)
你的意思是这样吗?
#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;
}
您可以根据需要在尾数和 exponent 中指定机器字的数量。 我使用TTMath来解决Project Euler难题,我对它非常满意。我认为它相对稳定,如果你有疑问,作者非常友好。
编辑:: 我过去也使用过MAPM。它表示 base 100 中的大浮点数,因此将十进制数转换为基数为100将没有问题,与基数2不同.TTMAT使用base 2来表示大浮点数。自图书馆页面声称,它自2000年以来一直保持稳定。它已在许多应用程序中使用,您可以在库页面中看到它。它是一个带有漂亮的C ++包装器的C库。
MAPM nextPrime(){
static MAPM prime = 3;
MAPM retPrime = prime;
prime += 2;
while( isPrime( prime ) == false )
prime += 2;
return retPrime;
}
答案 1 :(得分:3)
答案 2 :(得分:0)
如果你想自己动手,Binary Coded Decimal可能是你最好的选择。
答案 3 :(得分:0)
A list of decimal arithmetic packages,包括Robert Klarer的decNumber ++,它实现了即将发布的关于C ++中十进制算术类型的ISO技术报告中指定的接口:ISO / IEC TR 24733:C ++十进制浮点算术扩展
The Multiple Precision Floating point with correct Rounding library,但如果我没记错的话,那就是二进制浮点