1.0
-0.9
;
上面的運算為什麼不是0.1呢?
因為計算機只認識二進位制,做運算也是做二進位制的運算。
計算機會先將十進位制轉為二進位制,但是有些十進位制的無法用準確的二進位制表示。比如十進位制的小數轉二進位制:
十進位制小樹轉二進位制表示的過程,小數字乘以2,取整,小數部分繼續乘以2,再取整,直到小數部分為0為止,然後將取整位按順序排列。
十進位制 二進位制
0.10.0001
1001
1001
1001
...0.2
0.0011
0011
0011
0011
...0.3
0.0100
1100
1100
1100
...0.4
0.0110
0110
0110
0110
...0.5
0.10.6
0.1001
1001
1001
1001
......
我們發現有些小數的二進位制表示位數是無限迴圈的,這就造成了浮點數精度上的問題。
下面收集了一些解決方法:
function
add(num1,num2)
catch
(e)try
catch
(e) m = math.
pow(
10,math.
max(r1,r2));
return math.
round
(num1*m + num2*m)
/m;}
function
sub(num1,num2)
catch
(e)try
catch
(e) m = math.
pow(
10,math.
max(r1,r2));
n =(r1 >= r2)
? r1 : r2;
return
(math.
round
(num1 * m - num2*m)
/ m)
.tofixed
(n);
}function
mul(num1,num2)
catch
(e)try
catch
(e)catch
(e) r1 =
number
(num1.
tostring()
.replace
(".",""
)); r2 =
number
(num2.
tostring()
.replace
(".",""
));return r1 * r2 / math.
pow(
10,m);}
function
accdiv()
catch
(e)try
catch
(e)catch
(e) r1 =
number
(num1.
tostring()
.replace
(".",""
)); r2 =
number
(num2.
tostring()
.replace
(".",""
));return
(r1 / r2)
*math.
pwo(
10,t2-t1)
;}
雙精度,單精度和半精度
浮點數是計算機上最常用的資料型別之一,有些語言甚至數值只有浮點型 perl,lua同學別跑,說的就是你 常用的浮點數有雙精度和單精度。除此之外,還有一種叫半精度的東東。雙精度64位,單精度32位,半精度自然是16位了。半精度是英偉達在2002年搞出來的,雙精度和單精度是為了計算,而半精度更多是為了降...
二進位製雙精度加法運算
本實驗要求計算 x y z,將結果 z 輸出到螢幕,其中 x 001565a0h,y 0021b79eh。z 00371d3e 實驗利用累加器 ax,先求低十六位和,並存入低址儲存單元,後求高 16位和,再存入高址儲存單元。由於低位和可能向高位有進製,因而高位字相加語句需用 adc 指令,則低位相加...
關於單精度 雙精度的概念
單精度和雙精度數值型別最早出現在c語言中 比較通用的語言裡面 在c語言中單精度型別稱為浮點型別 float 顧名思義是通過浮動小數點來實現資料的儲存。這兩個資料型別最早是為了科學計算而產生的,他能夠給科學計算提供足夠高的精度來儲存對於精度要求比較高的數值。但是與此同時,他也完全符合科學計算中對於數值...