簡體   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