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

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

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

首先进行打表,求出尾码从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博客 ,格式可能有所偏差。