num1 =
0.1num2 =
0.2num3 =
0.3num4 = num1 + num2
if num3 == num4:
print
("y"
)else
:print
("n"
)
結果是n
0.1和0.2 相加 不等於 0.3
0.1+0.2=0.30000000000004
兩浮點數x,y進行加減運算時,必須按以下幾步執行(可參考 [4] 中插圖):
(1)對階,使兩數的小數點位置對齊,小的階碼向大的階碼看齊。
(2)尾數求和,將對階後的兩尾數按定點加減運算規則求和(差)。
(3)規格化,為增加有效數字的位數,提高運算精度,必須將求和(差)後的尾數規格化。
(4)捨入,為提高精度,要考慮尾數右移時丟失的數值位。
(5)判斷結果,即判斷結果是否溢位。
關鍵就在與對階這一步驟,由於float的有效位數只有7位有效數字,如果乙個大數和乙個小數相加時,會產生很大的誤差,因為尾數得截掉好多位。例如:
123 + 0.00023456 = 1.23*10^2 + 0.000002 * 10^2 = 123.0002
那麼此時就會產生0.00003456的誤差,如果累加多次,則誤差就會進一步加大。
kahan summation演算法
int
main()
float
add(
float f,
int count)
3.使用double,精度更高
4.ieee浮點數,為了規格化,精度每超過2的整數次冪,精度要下降一位,
你的f是0.1,float位數是23,當sum足夠大的時候,會出現 sum+f==sum 的情況,這個是ieee標準,和c++沒關係,事實上編譯器應該已經做了浮點精度調整了。
潛在誤差精度誤差
乙個浮不精確到7位小數。浮精確到大約7位有效數字。乙個重要的數字是任意數字,不是乙個佔位符0,包括在小數點左邊的。例如,0095有兩個佔位符零點,所以只有2位數。34.90有4個重要人物。有兩種型別的我們需要警惕的浮點值的誤差 捨入誤差和精度誤差。捨入誤差可以任意長度的數字發生,因為一些數字的二進位...
Python C語言擴充套件
這裡編寫個簡單例子來說明下具體是如何操作的 建立dll專案,結構如下 test mydll.h mydll.c 標頭檔案 mydll.h ifndef mydll h define mydll h ifdef build dll define dll export declspec dllexpor...
c語言 python C語言和python的區別
python可以說是目前最火的語言之一了,人工智慧的興起讓python一夜之間變得家喻戶曉,python號稱目前最最簡單易學的語言,現在有不少高校開始將python作為大一新生的入門語言。本萌新也剛開始接觸python,發現python與其他語言確實有很大的區別。python是由c語言實現的,因此想...