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