是否有表示浮点数的库类?

时间:2009-08-12 18:59:57

标签: c++ floating-point decimal

我正在编写一个应用程序,它使用十进制数字(例如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中)。

有人知道这样的图书馆吗?非常感谢。

4 个答案:

答案 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;
}

顺便说一句,如果你对GMP感兴趣并且你正在使用VS,那么你可以检查MPIR哪个是Windows的GMP端口;)对我来说,我觉得TTMath比所有的更令人愉悦,更容易/更快我尝试了什么,因为无论如何,库都会堆栈分配而不会触及堆。基本上它不是一个任意的精度库,你可以在编译时指定精度,如上所示。

答案 1 :(得分:3)

有一个库列表here

我从来没有尝试过任何一个,所以我不能推荐一个,但this one是GNU项目的一部分,所以它不能一半坏。

答案 2 :(得分:0)

如果你想自己动手,Binary Coded Decimal可能是你最好的选择。

答案 3 :(得分:0)