我们可以使用字符串来获得高精度浮点数吗?

时间:2016-08-21 19:55:51

标签: c++ floating-point floating-accuracy

我目前正在编写一个需要高精度浮点数的软件。有时我需要比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将执行添加,就像我们在小学里学到的一样(只有浮点数):

enter image description here

Substraction将以同样的方式工作。乘法和除法会更复杂,但它也会起作用。

我认为理论上你可以获得所需的精确度(有足够的RAM来存储字符串)。

我的问题是:

  1. 这种技术会慢得多(约10个小数位)吗?
  2. 是否已经使用过,是否有实施它的库?

2 个答案:

答案 0 :(得分:8)

这会慢得多,因为您使用完整字符表示一位数据,而您执行的操作将完全无法使用硬件实现的算术运算。更好的方法是设计一个任意长度的二进制格式。见https://gmplib.org。还有很多其他选择。

答案 1 :(得分:1)

您走在正确的轨道上,但std::string不是正确的数据结构。相反,请使用std::vector<unsigned char>,向量的每个元素都包含0std::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中进行算术。