在c++中拥有大浮点数
Own Big Float in 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.1415Before = '3';After = '1415';Pos = 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。当然也有其他的特殊情况,但是如果你尝试着去实现它们,你的论文就会很快从家庭作业变成论文。祝你好运!
-
不要使用两个单独的载体
before
和after
。你需要整个尾数来做算术运算 -
实际上你的
pos
是指数。相应地命名它。 -
你需要尾数符号。
-
我建议将尾数存储为有理数。你需要两个数字:分子和分母。
-
最好将数字存储为任意长度的整型,而不是数字数组。
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是标准字符串
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 使用提升将数据从 PyObject 复制到浮点数 *
- 使用浮点数和双精度数的非常小数字的数学
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何在 c++ 中将小数点后两位数的浮点数分配给另一个浮点数
- 返回浮点数的小数位数
- txt 文件中浮点数的最大和最小值
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 将浮点数转换为无符号字符数组并打印出来
- 如何将时间字符串 (M:SS) 转换为浮点数
- 如何将浮点数(*)[6]转换为浮点**类型?
- C++将浮点数乘以分数
- 如何将浮点数转换为uint8_t?
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 在数学上将浮点数四舍五入到 N 位小数
- 在c++中拥有大浮点数
- 在visual basic、java或c++中是否有可能拥有无限精度的浮点数据类型?