[英]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來存儲字符串)。
我的問題是:
這會慢很多,因為您將對單個數據使用完整的char,並且您執行的操作將完全無法使用硬件實現的算術運算。 更好的方法是改為設計任意長度的二進制格式。 參見https://gmplib.org 。 還有許多其他選擇。
您處在正確的軌道上,但是std::string
不是正確的數據結構。 而是使用std::vector<unsigned char>
,向量的每個元素都保存一個介於0
到std::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.