習題 3-12 浮點數
阿新 • • 發佈:2018-12-10
階碼為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; }