高精度計算問題中使用double失敗的原因

2021-06-28 21:06:48 字數 836 閱讀 7814

在比賽中經常可能接觸到高精度計算的問題,高精度演算法雖然不難,但是寫起來總是比直接用麻煩,於是我當時想了各種方法偷懶,想避免這個問題,當時最先想到的就是利用浮點型float 和double的高精度特性來代替高精度演算法。具體做法是先用乙個double型變數ans來計算並表示結果,然後把結果輸出時只顯示ans的整數部分。

以上偷懶的方法有時確實能夠僥倖成功,但是很多時候卻是以失敗告終,最後分析一下才發現失敗的原因:

以以下程式為例說明:

#include #include long long ans1;

double ans2;

float ans3;

int main()

程式執行結果:
2^56運算結果:

integer: 72057594037927936

double:  72057594037927936

float:   72057594037927936

2^57運算結果:

integer: 144115188075855872

double:  144115188075855870

float:   144115188075855870

可以看到當運算資料大於2^56時,就會出現結果偏差。查詢資料發現浮點數的運算本來就存在偏差,可能與機器內部儲存運算方式有關。所以float和double並不具備高精度運算的特性,希望後面跟我一樣想到這種偷懶方法的同學另闢蹊徑,去探索別的更高明的方法,不要在這裡浪費寶貴的時間了。

高精度計算

最近做了一些高精度計算問題,一般來說解題辦法都差不多,都是通過字串來操作的,下面是解題模板。清零操作 string clearstr string s if s return s 0 while s.length 0 s 0 0 s.erase 0,1 刪除第乙個零 if s return s 0 ...

高精度計算

include include includeusing namespace std const int l 110 string add string a,string b 只限兩個非負整數相加 nb l int la a.size lb b.size for int i 0 ilb la lb ...

高精度計算

一.高精度儲存 1.如對數採用的字串輸入 include include using namespace std const int n 100 最多100位 int main 2.直接讀入 include using namespace std const int n 100 最多100位 int...