浮点数及缺陷
數(shù)字分為整數(shù)和小數(shù).
char int ……都是用來(lái)存儲(chǔ)整數(shù)的.
那么小數(shù)如何保存呢?
小數(shù)在我們的C語(yǔ)言中,用float和double來(lái)表示.
float對(duì)應(yīng)著4個(gè)字節(jié)
double對(duì)應(yīng)著8個(gè)字節(jié).
long double 16個(gè)字節(jié)
計(jì)算機(jī)不管是任何數(shù)據(jù),最后都會(huì)轉(zhuǎn)換成1和0來(lái)存儲(chǔ).
而制定float和double是按照IEEE編碼規(guī)范的.
跟原碼補(bǔ)碼反碼和Ascll、Unicode碼,還有x86.X64一樣.
都是為了一個(gè)原則,統(tǒng)一規(guī)范.大家都按照這個(gè)套路來(lái).
深究為什么這樣設(shè)計(jì)沒(méi)有太大意義.
浮點(diǎn)數(shù)在內(nèi)存里面和整數(shù)存儲(chǔ)理解是不一樣的。
浮點(diǎn)數(shù)需要考慮小數(shù)點(diǎn)。
就拿float來(lái)舉例吧。
127.53這是一個(gè)小數(shù)。
還記得科學(xué)計(jì)數(shù)法嗎?用科學(xué)計(jì)算法可以將小數(shù)點(diǎn)的位置固定。
我們可以這樣表示:12.753 x 101也可以寫(xiě)成1.2753 x 102結(jié)果都等同于127.53。
8.25這個(gè)小數(shù)也可以表示成8.25 x 10 0
-0.012這個(gè)小數(shù)也可以表示為1.2 x 10 -2
十進(jìn)制整數(shù)轉(zhuǎn)換二進(jìn)制整數(shù)大家用計(jì)算器很容易轉(zhuǎn)換。
假如我們現(xiàn)在要把20.5這個(gè)小數(shù)放到float里面.
那如何把20.5轉(zhuǎn)換成2進(jìn)制數(shù)呢?
分兩次轉(zhuǎn)換。
整數(shù)除以2,商繼續(xù)除以2,得到0為止,將余數(shù)逆序排列。
小數(shù)乘以2,取整,小數(shù)部分繼續(xù)乘以2,取整,得到小數(shù)部分0為止,將整數(shù)順序排列。
20.5
20 / 2= 10 余數(shù)為0
10/ 2= 5 余數(shù)為0
5 / 2= 2 余數(shù)為1
2 / 2 =1 余數(shù)為0
1/ 2= 0 余數(shù)為1
整數(shù)的部分是10100
所有的整數(shù)一定可以轉(zhuǎn)換成一個(gè)二進(jìn)制數(shù).
第1位符號(hào)位。正數(shù)為0,負(fù)數(shù)為1.
第2位到第9位指數(shù)位。
是0000 0100這樣存儲(chǔ)嗎?
不是的,float需要指數(shù)+111 1111(127)然后把結(jié)果存儲(chǔ)進(jìn)去。
100+111 1111=10000011 (131)
0-1000 0011-0100 1000 0000 0000 0000 000 = 這就是20.5的float二進(jìn)制內(nèi)存表示。
30.3
20=10100
0.3*2=0.6(0)
0.6*2=1.2(1)
0.2*2=0.4 (0)
0.4*2=0.8 (0)
0.8*2=1.6 (1) //進(jìn)入循環(huán)
0.6*2=1.2(1)
0.2*2=0.4 (0)
0.4*2=0.8 (0)
0.8*2=1.6 (1)
二進(jìn)制為10100.010011001(無(wú)限循環(huán))
科學(xué)計(jì)算法:1.01000 1001 1001 1001 E100
0-1000 0011-01000 1001 1001 1001 1001 10= 這就是20.3的float二進(jìn)制內(nèi)存表示。
float 1 8 23
double 1 11 52
32位單精度
單精度二進(jìn)制小數(shù),使用32位存儲(chǔ)。
1 8 23 位長(zhǎng)
偏正值 +127 0111 1111
64位雙精度
雙精度二進(jìn)制小數(shù),使用64位存儲(chǔ)。
1 11 52 位長(zhǎng)
偏正值 +1023 011 1111 1111
所以,不難發(fā)現(xiàn),有些10進(jìn)制小數(shù),用二進(jìn)制小數(shù)來(lái)表示的時(shí)候,是無(wú)法準(zhǔn)確的表示,只是相似。
這就造成了,小數(shù)計(jì)算會(huì)造成結(jié)果不精準(zhǔn)。
而我們知道貨幣是精確到2位的。1.53 一元五角三分。
所以貨幣用這種計(jì)算是很危險(xiǎn)的。
float v1;
float v2;
float v3;
#include <stdio.h>
#include <stdlib.h>
void main() {
v1 = 20.3;
v2 = 13.8;
v3 = v1 + v2;
printf("v3 is %f\n",v3);
system("pause");
}
dvd vcd 這是視頻格式編碼
mp3 wav
同樣的音質(zhì)
mp3= 5M
wma=2M
wma wmv //微軟公司
jpg png gif bmp
//解碼器
轉(zhuǎn)載于:https://www.cnblogs.com/xiaodaxiaonao/p/7430256.html
總結(jié)
- 上一篇: 分库分表产生的问题,及注意事项
- 下一篇: 美国新WiFi技术功耗低于蓝牙LE和Zi