關(guān)于浮點(diǎn)數的小數部分計算
收到QQ上一個(gè)留言,有位網(wǎng)友詢(xún)問(wèn)我一個(gè)簡(jiǎn)單的問(wèn)題。問(wèn)題如下:
本文引用地址:http://dyxdggzs.com/article/201608/294898.htm1111 011. 1 0001 1110 1011 1000=123.559998,小數點(diǎn)后是怎么計算的呢?謝謝您!
很明顯1111 011. 1 0001 1110 1011 1000是一個(gè)二進(jìn)制數。整數部分當然好計算,將每位的權值加起來(lái)即可。這位網(wǎng)友詢(xún)問(wèn)的是小數部分的計算方法。其實(shí)也非常簡(jiǎn)單。
0.10001111010111000=2^(-1)+2^(-5)+2^(-6)+2^(-7)+2^(-8)+2^(-10)+2^(-12)+2^(-13)+2^(-14)=0.559998
這個(gè)可以通過(guò)計算器來(lái)計算。但是小數后位數太多,容易出錯。我們可以編寫(xiě)一段簡(jiǎn)單的代碼來(lái)計算。代碼如下:
#include
#include
char a[]="10001111010111000";
void main( )
{
unsigned char i;
double sum =0.0;
printf("sum=");
for( i =0 ; i< sizeof(a); i++)
{
if( a[i] =='1')
{
sum = sum + pow(2,-(i+1));
printf("+2^(%d)",-(i+1));
}
}
printf("n%fn", sum);
}
我這樣回答希望他明白!
評論