在c++中拥有大浮点数

Own Big Float in C++

本文关键字:浮点数 拥有 c++      更新时间:2023-10-16

我想用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.1415Before = '3';After = '1415';Pos = 1;如果你能理解的话…但是赋值需要我节省一些内存,我没有,因为我分配的每个数字大约是1字节,我猜这太大了。

问题:

如何表示这些任意长的数字?(抱歉我的英语不好,我希望这篇文章有意义)

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

的例子:

  1. 255不需要32位

我认为你的字符向量是好的。如果你被允许使用c++ 11编译器,我可能会将其更改为uint8_t的矢量,并确保当我存储值时,我可以在大小为1的矢量中存储从0到255的值。

然而,这并不是结束。听起来,你想要的是任意数量的有效数字。但是,对于真正的浮点表示,在确定类型的基数之后,还需要为基数和指数分配存储空间。还有一个问题是你是否想让你的指数也任意长。

那么,我可能会对你的类成员使用这样的内容:

//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;

接下来的问题是为你的类型实现各种操作符,并测试各种场景以确保你的解决方案有效。

如果您真的想要彻底,您可以使用一个简单的测试框架来确保您在此过程中修复的问题保持不变。

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

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>

正如其他人提到的,小数前后并不需要两个向量。然而,我在答案中使用了2,因为这样更容易理解,而且你不必跟踪小数点。当你处理一长串数字时,两个向量和一个向量的内存需求实际上并没有什么不同。

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

更新:如果这实际上是作业,如果你需要支持任何浮点特殊情况,我会和给你作业的人核实一下,其中最简单的是nan。当然也有其他的特殊情况,但是如果你尝试着去实现它们,你的论文就会很快从家庭作业变成论文。祝你好运!

  1. 不要使用两个单独的载体beforeafter。你需要整个尾数来做算术运算

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

  3. 你需要尾数符号。

  4. 我建议将尾数存储为有理数。你需要两个数字:分子和分母。

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


p。我很久以前做过这样的计算器。为了说明我的答案,我给你一个number的类声明:

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是标准字符串