UVA - 11809 Floating-Point Numbers

由于0<=m<=9,1<=e<=30,首先可通过一个表记录所有m和e的组合可得到的最大值及其十进制科学计数法形式下的尾数和指数。

二进制浮点数情况下:

(1)若有m位尾数,则实际表示尾数为a = 1 - 2^( -m-1 )(自带一位尾数);

(2)若有e位阶码,则实际表示指数为2^b = 2^[ 2^e - 1 ];

设十进制形式下尾数为c,指数为d,则:a * 2^b = c * 10^d,两边同时取以10为底的对数,有:log10(a) + b * log10(2) = log10(c) + d。

令等式左边等于x,由于科学计数法要求1<=c<10,定有 log10(c) <= 0,且d为整数,则d = floor(x),那么c = 10^(x - d)。 

对任意输入的p * 10^q,查表逐个匹配,只要q = d且fabs(p - c)小于给定误差(由于浮点数精度误差),即可认为查找成功,输出对应的m和e。

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
    //freopen("input.txt","r",stdin);
    double M[10][31],a,c,x;
    long long int E[10][31],b,d;
    int i,j;
    for(i=0;i<=9;i++)
        for(j=1;j<=30;j++){
            a=1-pow(2,-(i+1));
            b=pow(2,j)-1;
            x=log10(a)+b*log10(2);
            d=floor(x);
            c=pow(10,x-d);
            M[i][j]=c;
            E[i][j]=d;
        }

    char s[30];
    double p;
    int q;
    while(cin>>s){
        if(s=="0e0")
            break;
        s[17]=' ';
        sscanf(s,"%lf %d",&p,&q);
        for(i=0;i<10;i++)
            for(j=1;j<=30;j++)
                if(fabs(M[i][j]-p)<1e-4&&E[i][j]==q)
                    cout<<i<<' '<<j<<endl;
    }
    return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值