【问题标题】:Is there a library class to represent floating point numbers?是否有一个库类来表示浮点数?
【发布时间】:2009-08-12 18:59:57
【问题描述】:

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

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

【问题讨论】:

  • 是的,您要查找的数据类型称为十进制。但是,它不是浮点类型。例如,它是表示货币时使用的数据类型。
  • ...?他问是否存在这样的图书馆。你说,'是的,......'
  • 那么我以一种模糊的方式表达了自己。我想说的是,这种类型通常被称为“十进制”,这会给他指明要查找的内容。
  • 如果你想代表金钱,只需将其存储为小货币单位,然后再进行转换,例如,如果你想将其代表给人类。
  • 我知道数据类型 decimal 存在于 C# 中,但不存在于 C++ 中,因此是原始问题。

标签: c++ floating-point decimal


【解决方案1】:

你的意思是这样的吗?

#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 解决了 Project Euler 难题,对此我感到非常满意。我觉得比较稳定,有问题作者也很亲切。


EDIT:: 我过去也使用过MAPM。它以 base 100 表示大浮点数,因此将十进制数转换为 base 100 不会有问题,这与 base 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 比我所有的更令人愉悦、更容易/更快尝试过,因为库在不接触堆的情况下进行堆栈分配。基本上它不是一个任意精度的库,您可以在编译时指定精度,如上所示。

【讨论】:

    【解决方案2】:

    有一个库列表here

    我从未尝试过其中任何一个,所以我不能推荐一个,但是this one 是 GNU 项目的一部分,所以它不会差一半。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-07
          • 2015-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          • 1970-01-01
          • 2020-12-12
          相关资源
          最近更新 更多