在C++中拥有Big Float

tyr*_*hus 8 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
};
Run Code Online (Sandbox Code Playgroud)

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

题:

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

Car*_*arl 4

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

例子:

  1. 255不需要32位

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

然而,这还没有结束。从它的声音来看,您所追求的是任意数量的有效数字。然而,对于真正的浮点表示,在决定您的类型的基数是什么之后,您还需要为基数和指数分配存储空间。还有一个问题是你是否希望你的指数也任意长。我们假设是这样。

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

//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;
Run Code Online (Sandbox Code Playgroud)

然后,需要针对您的类型实现各种运算符并测试各种场景,以确保您的解决方案有效。

如果您确实想要彻底,您可以使用一个简单的测试框架来确保您一路解决的问题始终得到解决。

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

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>
Run Code Online (Sandbox Code Playgroud)

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

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

更新:如果这实际上是作业,我会询问给您作业的人是否需要支持任何浮点特殊情况,其中最简单的是 NaNs。还有其他特殊情况,但尝试实现所有这些都会很快将其从家庭作业变成论文。祝你好运 :)

  • 我质疑这里指数是否必要,如果已经使用两个向量,为什么要把它复杂化呢? (2认同)