输入一个用AeB表示的浮点数,求他的尾码和阶码的大小。
一开始准备用double保存所有情况,后来发现最大值是2(230)会溢出,直接算不可行,最后使用去对数解决。
首先进行打表,求出尾码从0到9时表示浮点数的标准值。
对于读入的AeB,用streamstring读出A、B的值,然后用对数法求对应的m和e,当所求值与之前算的标准值误差小于EPS时就是所求解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #include<iostream> #include<string> #include<sstream> #include<cmath> const double EPS=1e-13; using namespace std; long double stdm[12],a=0.0; int b=0; bool read(){ string s; if(!(cin>>s)||s=="0e0") return false; s[17]=' '; stringstream ss(s); ss>>a>>b; return true; } void solve(){ long double k,l; int m=0,e=0; for(int i=0;i<12;i++){ k=a/stdm[i]; l=log2((log10(k)+b)*log2(10.0)+1); e=(int)floor(l+0.5); if(fabs(e-l)<EPS){ m=i; break; } } cout<<m<<" "<<e<<endl; return; } int main(){ for(int i=0;i<12;i++) stdm[i]=1-pow(0.5,i+1); while(read()){ solve(); } return 0; }
|
** 本文迁移自我的CSDN博客,格式可能有所偏差。 **