2016-08-21 42 views
1

我目前正在編寫一個需要高精度浮點數的軟件。有時我需要比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

減法會的工作方式相同。乘法和除法會更復雜,但它也可以工作。

我想在理論上你可以達到儘可能多的精度,因爲你需要(有足夠的內存來存儲字符串)。

我的問題是:

  1. 請問這種技術是多少(對於〜10位小數)慢?
  2. 它已經被使用過,有沒有實現它的庫?
+0

這被稱爲浮點模擬,它顯着較慢,因爲本地浮點計算通常是原子CPU commad,而模擬可能需要數十個CPU命令。 –

+1

假設你的意思是10位有效數字而不是10位小數(否則,這些信息實際上與問題無關),「double」綽綽有餘,足以精確存儲所需的信息。然後再一次,你的散文與你的實際例子不符,所以誰知道。 –

+0

請注意,'3'+'2'幾乎肯定不等於'5',因爲'3'不等於'3','2'不等於'2'用我見過的任何字符編碼。 –

回答

8

這會慢很多,因爲你會使用一個完整的字符數據的一個數字,並且你執行的操作將完全無法使用硬件實現的算術運算。更好的方法是設計一個任意長度的二進制格式。見https://gmplib.org。還有很多其他選項。

+1

在某些體系結構中,實際上有一些硬件支持用於這種基於字符的處理。例如,32位'x86'架構的指令爲'AAA'(加法後ASCII調整),'AAS'(減法後ASCII調整),'AAM'(乘法後調整ASCII)和'AAD'分割後)。然而,這些方法的存在並不能改變這種方法的效率非常差的事實。 – njuffa

+1

也可以利用['mpf_class'](https://gmplib.org/manual/C_002b_002b-Class-Interface.html#C_002b_002b-Class-Interface)在C++中簡化操作。 –

1

你在正確的軌道上,但std::string不是正確的數據結構。相反,使用std::vector<unsigned char>,向量的每個元素都保持範圍0std::numeric_limits<unsigned char>::max()之間的值。這個上限通常是255.加法和減法的規則就像你作爲一個孩子學到的那樣,除了你有256個手指而不是10個。這聽起來很不自然,但想法是你有一堆數字用於基數爲256的數字表示,以及加法和減法的規則相同,不同之處在於當結果大於255時,而不是大於9時的結果。只要做一個更大的無符號類型的算術;結果%256是當前數字中的值,結果/ 256是要攜帶的數量。

一旦你圍繞這個想法,你也可以考慮使用std::vector<unsigned long long>而不是std::vector<unsigned char>,這將意味着以2^64的基數進行算術。

相關問題