int共32位,能夠表示的最大的數爲2^32次方
float雖然也是32位,可是是以指數形式保存,指數佔8位(含符號),最大127,則表示最大數爲2^127,能夠表示到10^38次方數
9.205357638345294e18
5.699141892149156e76 -->不能單純用float表示
0e0
double類型指數佔11位,最高能夠表示到10^308次方,能夠知足輸入條件
19/2 = 9...1
9/2=4...1
4/2=2...0
2/2=1...0
1/2=0...1
0.625*2 = 1.25 --> 1
0.25*2 = 0.5 --> 0
0.5*2 = 1.0 --> 1
Xe18位數範圍爲18/3*9到(18/3+1)*10之間--->其中18/3+1中+1是爲了防止X帶來的偏差(例如X=8就是2^3,因此咱們不妨直接將其擴大10位,即1*10)
9.205357638345294e18
5.699141892149156e76
0e0
bit = 0;
while (temp>1)
{
temp /= 10;
bit++;
}
bit--; //bit是整數位數(1000.1就是bit=3)
for (bin_bit = bit / 3 * 9; bin_bit <= (bit / 3 + 1) * 10; bin_bit++) { if ((num / pow(2.0, bin_bit)) < 1) break; }
其中num是咱們獲取的須要處理的最大浮點數
bin_bit是根據三(二)中肯定的值,循環次數從bit/3*9到(bit/3+1)*9,
當num/pow(2.0,bin_bit)小於1時,就是處理了全部的的指數值
//指數是bin_bit位
//尾數是num / pow(2.0, bin_bit)
mant_val = num / pow(2.0, bin_bit); //double轉float只是爲了保留15位小數,方便後面比較運算 expo_val = bin_bit;
while (expo_val) { expo++; //初始爲0 expo_val /= 2; }
while (mant_val>1e-15) //由於float有效位數15位 { if (mant_val * 2 >= 1.0) mant_val = mant_val*2 - 1; else mant_val = mant_val * 2; mant++; }
mant--; //由於有一個1被默認省略,因此減去
//浮點數求尾數和指數位數
//整數部分除2,小數部分乘2
void test37()
{
double num, temp; //考慮位數,取double類型
int bit,bin_bit;
float mant_val; //尾數值
int expo_val; //指數值
int mant, expo; //尾數位數和指數位數
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
while (1)
{
scanf("%lf", &num); //注意:double類型讀取時,使用lf
expo = mant = 0;
temp = num;
if (temp == 0)
break;
bit = 0;
while (temp>1)
{
temp /= 10;
bit++;
}
bit--;
for (bin_bit = bit / 3 * 9; bin_bit <= (bit / 3 + 1) * 10; bin_bit++)
{
if ((num / pow(2.0, bin_bit)) < 1)
break;
}
//指數是bin_bit位
//尾數是num / pow(2.0, bin_bit)
mant_val = num / pow(2.0, bin_bit); //double轉float只是爲了保留15位小數,方便後面比較運算
expo_val = bin_bit;
while (expo_val)
{
expo++;
expo_val /= 2;
}
while (mant_val>1e-15)
{
if (mant_val * 2 >= 1.0)
mant_val = mant_val*2 - 1;
else
mant_val = mant_val * 2;
mant++;
}
mant--; //由於有一個1被默認省略,因此減去
printf("%d %d\n", mant, expo);
}
freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
}