1. 程式人生 > >習題 3-12 浮點數

習題 3-12 浮點數

階碼為6,尾數為8的可表達最大的浮點數是0.111111111(2)*2^111111(2) 換算十進位制為  0.998046875*2^63

而, 0.998046875*2^63=9.205357638345294*10^18

等價於               m*2^e=a*10^b        其中m為1-pow(2,-i-1),e為pow(2,j)-1,當i=8,j=6時,m*2^e得到0.998046875*2^63

兩邊取對數     log10(m)+e*log10(2)=log10(a)+b

當 temp= log10(m)+e*log10(2),     temp=log10(a)+b 也成立, a,b為未知數,o<log10(a)<1

b=(int)temp,a=10^(temp-b),a為輸入的9.205357638345294,b為18

程式碼如下:

#include<iostream>
#include<cstring>
#include<sstream>
#include<cmath>
using namespace std;

double a[15][35];
int b[15][35];
const double EPS=1e-5;

int main(){
	string str;
	double A;
	int B;
	//以0.998046875*2^63轉化為9.205357638345294*10^18為例,對應的i=8,j=6 ,i對應尾數,j對應階碼 
	for(int i=0;i<10;i++){
		for(int j=1;j<31;j++){
			double a1=1-pow(2,-i-1);	//十進位制的尾數 0.998046875
			double b1=pow(2,j)-1;	//十進位制的階碼 63
			double temp=log10(a1)+b1*log10(2);	// log10(0.998046875*2^63)=log10(0.998046875)+63*log10(2)
			b[i][j]=(int)temp;	//18
			a[i][j]=pow(10,temp-b[i][j]);	//9.205357638345294		
		}
	}
	while(cin>>str&&str!="0e0"){
		str.replace(str.find('e'),1," ");
		stringstream s(str);
		s>>A>>B;	//A為 9.205357638345294,B為18 
		bool flag=false;
		for(int m=0;m<10;m++){
			for(int e=1;e<31;e++){
				if(b[m][e]==B&&fabs(A-a[m][e])<EPS){
					cout<<m<<" "<<e<<endl;
					flag=true;
					break;
				}
			}
			if(flag)
				break;
		}
		
	}
	
	return 0;
}