UVa 11809 - Floating-Point Numbers(取对数)

输入一个用AeB表示的浮点数,求他的尾码和阶码的大小。

一开始准备用double保存所有情况,后来发现最大值是2^(2^30)会溢出,直接算不可行,最后使用去对数解决。

首先进行打表,求出尾码从0到9时表示浮点数的标准值。

对于读入的AeB,用streamstring读出A、B的值,然后用对数法求对应的m和e,当所求值与之前算的标准值误差小于EPS时就是所求解。

#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;
}


你可能感兴趣的:(uva)