我目前正在编写一个需要高精度浮点数的软件。有时我需要比double
给我更精确的精确度。我知道为什么经典的浮点数只能达到有限的精度。
我正在考虑这个问题,并且有想法使用string
来表示数字并使用它们进行计算。
string number_one = "12.3459233547343432";
string number_two = "738.67632487523747384";
string sum = sum_strings(number_one, number_two);
cout << sum << endl; // 751.0222482299717...
然后函数sum_strings
将执行添加,就像我们在小学里学到的一样(只有浮点数):
Substraction将以同样的方式工作。乘法和除法会更复杂,但它也会起作用。
我认为理论上你可以获得所需的精确度(有足够的RAM来存储字符串)。
我的问题是:
答案 0 :(得分:8)
这会慢得多,因为您使用完整字符表示一位数据,而您执行的操作将完全无法使用硬件实现的算术运算。更好的方法是设计一个任意长度的二进制格式。见https://gmplib.org。还有很多其他选择。
答案 1 :(得分:1)
您走在正确的轨道上,但std::string
不是正确的数据结构。相反,请使用std::vector<unsigned char>
,向量的每个元素都包含0
到std::numeric_limits<unsigned char>::max()
范围内的值。这个上限通常是255.加法和减法的规则就像你小时候学过的那样,除了你有256个手指而不是10个。这听起来很轻浮,但想法是你有一堆数字数字的base-256表示,加法和减法的规则相同,除了你在结果大于255时携带,而不是当它大于9时。这比听起来容易;只需用更大的无符号类型进行算术运算;结果%256是当前数字中的值,结果/ 256是要携带的数量。
一旦你把想法包围起来,你也可以考虑使用std::vector<unsigned long long>
代替std::vector<unsigned char>
,这意味着在base-2 ^ 64中进行算术。