繁体   English   中英

我们可以将字符串用于高精度浮点数吗?

[英]Could we use strings for high precision floating-point numbers?

我目前正在编程需要高精度浮点数的软件。 有时我需要的精度比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然后将执行加法sum_strings ,就像我们在小学时就已经学过一样(只是浮点运算):

在此处输入图片说明

减法将以相同的方式工作。 乘法和除法会更复杂,但也可以。

我认为从理论上讲,您可以达到所需的精度(具有足够的RAM来存储字符串)。

我的问题是:

  1. 这种技术会慢很多吗(约10个小数位)?
  2. 它已经被使用了吗?

这会慢很多,因为您将对单个数据使用完整的char,并且您执行的操作将完全无法使用硬件实现的算术运算。 更好的方法是改为设计任意长度的二进制格式。 参见https://gmplib.org 还有许多其他选择。

您处在正确的轨道上,但是std::string不是正确的数据结构。 而是使用std::vector<unsigned char> ,向量的每个元素都保存一个介于0std::numeric_limits<unsigned char>::max()范围内的值。 上限通常为255。加法和减法的规则与您小时候所学的规则相同,不同之处在于您的手指数为256,而不是10。这听起来有些flip昧,但想法是,您有很多数字一个以256为底的数字表示形式,以及加减法则相同。不同之处在于,当结果大于255而不是大于9时,您必须携带该值。 只是使用更大的无符号类型进行算术运算; 结果%256是当前数字的值,结果/ 256是要携带的数量。

一旦您解决了这个问题,您还可以考虑使用std::vector<unsigned long long>代替std::vector<unsigned char> ,这意味着在base-2 ^ 64中进行算术运算。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM