Py裡面浮點數精度的問題 在numpy中

2021-08-28 15:23:15 字數 1445 閱讀 7978

引言,今年是py加入全國計算機二級大禮包的第一年,看了幾道題,比如:

0.1+0.1==0.2  返回true

0.1+0.2==0.3返回false

都是0 1 二進位制惹的禍,真是一點不省油。。。。弄好久   累

對於十進位制,它只能表示以進製數的質因子為分母的分數。10 的質因子有 2 和 5。比如1/2、1/4、1/5、1/8和 1/10 都可以精確表示,因為這些分母只使用了10的質因子。相反,1/3、1/6 和 1/7 都是迴圈小數,因為它們的分母使用了質因子 3 或者 7。二進位制下(進製數為2),只有乙個質因子,即2。因此你只能精確表示分母質因子是2的分數。二進位制中,1/2、1/4 和 1/8 都可以被精確表示。但是,1/5 或者 1/10 就變成了迴圈小數。所以,在十進位制中能夠精確表示的 0.1 與 0.2(1/10 與 1/5),到了計算機所使用的二進位制數值系統中,就變成了迴圈小數。當你對這些迴圈小數進行數**算時,並將二進位制資料轉換**類可讀的十進位制資料時,會 對小數尾部進行截斷處理。

不同語言執行0.1+0.2 可以見0.1+0.2在各種語言中的結果

回歸正題,博主在numpy中求乙個整數矩陣a 的逆矩陣 結果a-1是float型,  a點積a-1的結果也是浮點型,並不是好看的對角為1的矩陣

在此可以在初始設定

numpy.set_printoptions(suppress=true)

%設定suppress是不使用科學計數

%括號裡也可以是precision=位數,小數的位數

例子

import numpy as np

from numpy.linalg import inv,qr

a=np.array([[0,1,2],[1,1,4],[2,-1,3]])%線性代數書上乙個例子

inv(a)%求逆矩陣

out[26]:

array([[-7., 5., -2.],

[-5., 4., -2.],

[ 3., -2., 1.]])

np.dot(a,inv(a))

out[28]:

array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00],

[0.00000000e+00, 1.00000000e+00, 4.44089210e-16],

[8.88178420e-16, 2.22044605e-16, 1.00000000e+00]])

%本應該是對角1矩陣的

np.set_printoptions(suppress=true)

np.dot(a,inv(a))

out[32]:

array([[1., 0., 0.],

[0., 1., 0.],

[0., 0., 1.]])

%現在就和py資料分析第二版裡面的顯示一樣了

浮點數精度問題

一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...

浮點數的精度問題

float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 對於二進位制的小數 1.1 1 20 1 2 1 1 1 2 1.5 1.01 1 20 0 2 1 1 2 2 1 1 4 1.25 1.0011 1...

浮點數精度丟失問題

c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...