兩張圖帶你入門數值科學
5 人贊了文章
先來說說封面的問題:
a = 100 + 1/3 - 100
b = 1/3
問 a == b 的結果
接觸過編程的應該都知道這題答案是False, 但是為什麼呢?
為什麼 a = 0.3333333333333286,是以286結尾而不是其他數呢?
計算機中的小數使用浮點數floating point 表示的,而且是2進位
↓總精度p(包括小數點前的1位和後面的p-1位)↓
1/3 = 0.01010101010101010101010101010101010101010101010
而且這個精度是固定的,分配給一個浮點數的內存是有限的
1/3 = 1.010101010101010101010101010101010101010101010*2^(-2)
這個是normalize之後的狀態
而我們加了100之後
a = 1.0001010101010101010101010101010101010101010101010*2^(2)
↑加進來的100↑ ↑溢出的精度↑
因為加進來了3個精度,而p的精度又是固定的,所以後面的010就溢出了,系統直接扔掉了
而減了100之後
a = 1.010101010101010101010101010101010101010101000*2^(-2)
↑多出的精度↑
減了100之後,就少了3個精度,最後多出來的3個精度用0補齊,於是就000了
這時我們再換成小數
a = 0.3333333333333286
這就是為什麼(100+1/3 -100)!= 1/3
而且最後末尾的數不是000而是286
根據系統,變成軟體的不同可能這個後面的多出來數字會不一樣,因為浮點數的種類不一樣。
浮點數種類由以下四個值決定
分別表示
base:進位數和底數(保持進位數和底數的一制在進位時就只要移動小數點就可以了,比如1.22×100=122,直接移動小點就可以×100,十進位如此,在其他進位中同理)
precisison:精度,也就是一共有多少位可以存儲
Low: 最小指數
up: 最大指數
下次如果面試問到這個問題不要只回答False,把這一套理論講給你的面試官聽,錄取幾率一定大幅提升。
最後為了不做標題黨,送上兩張完整的數值科學圖鑑。
這是圖1:上文內容就用到了紅色方塊中的知識
這個是圖2
然後這就是計算機數值科學的入門了,所有入門知識都在這裡了。
ps:
好吧,以上這兩張其實是開卷考的所用的小抄
趕緊趁著考完,在沒忘光之前寫一篇hhh
喜歡的話,就點個贊和評論吧!
推薦閱讀: