在C ++中拥有Big Float

时间:2013-05-19 19:23:07

标签: c++

我想在C ++中编写自己的变量“type”作为作业。它应该是一个任意长的浮点数。我在考虑像...这样的结构。

代码:

class bigFloat
{
public:
    bigFloat(arguments);
    ~bigFloat();

private:
    std::vector<char> before; // numbers before decimal point
    std::vector<char> after; // numbers after decimal point
    int pos; // position of decimal point
};

如果我的号码如下:3.1415 在='3'之前;之后='1415'; pos = 1; 如果这对你有意义......但是分配要我保存一些内存,我不这样做,因为我所分配的每个数字大约是1个字节,这是我猜的太多了。

问题:

你会如何代表那些任意长的数字? (抱歉我的英文不好,我希望这篇文章有道理)

2 个答案:

答案 0 :(得分:3)

如果你需要保留内存,那就意味着你需要尽可能高效地使用内存。换句话说,考虑到你要存储的值,你不应该浪费字节。

示例:

  1. 255不需要32位
  2. 我认为你的字符向量很好。如果您被允许使用C ++ 11编译器,我可能会将其更改为uint8_t的向量,并确保在存储可以存储0到255之间值的值时一个大小为1的向量。

    但是,这不是它的结束。从它的声音来看,你所追求的是任意数量的有效数字。但是,对于真正的浮点表示,在确定类型的基数后,还需要为the base and exponent分配存储空间。还有一个问题是你是否希望你的指数也是任意长的。我们假设如此。

    所以,我可能会为你班上的成员使用这样的东西:

    //Assuming a base of 10.
    static uint8_t const base = 10;
    std::vector<uint8_t> digits_before_decimal;
    std::vector<uint8_t> digits_after_decimal;
    std::vector<uint8_t> exponent;
    std::bitset<1> sign;
    

    然后是为您的类型实现各种运算符并测试各种方案以确保您的解决方案有效。

    如果您真的想要彻底,可以使用a simple testing framework来确保您在此过程中遇到的问题保持不变。

    在内存中,它基本上看起来像数字的二进制表示。

    For example:
    65535 will be: before_decimal =<0xff,0xff>, after_decimal vector is empty
    255.255 will be: before_decimal =<0xff>, after_decimal=<0xff>
    255255 will be: before_decimal =<0x03,0xe5,0x17>, after_decimal vector is empty
    255255.0 will be: before_decimal =<0x03,0xe5,0x17>, after_decimal: <0>
    

    正如其他人所提到的,你在十进制之前和之后并不需要两个向量。但是,我在答案中使用了两个,因为它更容易理解,你不必跟踪小数。当你处理一长串数字时,两个对一个向量的内存需求确实没有那么不同。

    我还应该注意,使用整数来记录小数点的位置会将您的位数限制为20亿,这不是任意长的数字。

    更新:如果这实际上是家庭作业,如果你需要支持任何浮点特殊情况,我会检查给你作业的人,其中最简单的是NaNs。还有other special cases,但试图实现所有这些将很快将这从家庭作业转变为论文。祝你好运:)

答案 1 :(得分:2)

  1. 请勿使用两个单独的向量beforeafter。你需要整个尾数来进行算术运算。

  2. 实际上您的pos是指数。相应地命名。指数是btw。

  3. 你需要尾数的标志。

  4. 我建议将尾数存储为合理分数。你需要两个数字:分子和分母。然后你就可以不进行四舍五入。

  5. 最好将数字存储为具有任意长度的整数而不是数字数组。


  6. PS。我很久以前就做过这样的计算器。为了说明我的答案,我给你一个数字类的声明:

    class CNumber
    {
    // ctors, methods....
       char cSign; // sign of mantissa
       CString strNumer; // numerator of mantissa
       CString strDenom; // denominator of mantissa
       char cExpSign; // sign of exponent
       CString strExp; // exponent
    };
    

    我使用了MFC。 CString是那里的标准字符串。