UVA - 11809(打表)

本文探讨了计算机中浮点数的阶码-尾数存储方法,通过具体实例讲解了如何将十进制数AeB转换为二进制浮点数的阶码E和尾数M。利用对数特性,通过预计算表格来加速查找过程,实现高效转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

题意:

计算机采用阶码-尾数方法存储浮点数,如果阶码(E)有6位,尾数(M)有8位,最大可以表示的浮点数是

0.111 111 111(2)* 2^111 111(2),小数点后第一位必须为,保证m在0.5-1的范围内,所以一共有9位小数。

现在给出10进制的数字AeB,表示A*10^B,输出对应的M,E。

 

思路:

一开始不知道怎么做,参考了网上的文章,发现可以打表,因为M,E的范围都已经给出来了,

所以从0-9枚举M,1-30枚举E,然后转换为对应的A,B就好了,

但是数据太大回超限,所以需要特殊处理,对两遍去log10,

A*B^10 = C(2) * 2^d(2).

log10(A) + B = log10(C(2)) + d(2)*log10(2)

然后每次寻找表内最接近的值就好了。

 

参考文章

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
double ans[15][50]; //打表,枚举m在0-9,e在1-30范围内的最大数 
int main(void)
{
	double e,m,x;
	int i,c,d;
	char ss[550];
	for(c=0;c<=9;c++){
		for(d=1;d<=30;d++){
			m=1-pow(2,-1-c);//尾数 
			e=pow(2,d)-1; //指数 
			ans[c][d]=log10(m)+e*log10(2.0);
		}
	}
	while(1){
		scanf("%s",ss);
		for(i=0;ss[i];i++)
		if(ss[i]=='e'){
			ss[i]=' ';break;
		}
		sscanf(ss,"%lf %d",&m,&d);
		if(m==0&&d==0) break; //终止条件 
		x=log10(m)+d;
		int fg=0;
		for(c=0;c<=9;c++){
			for(d=1;d<=30;d++){
				if(fabs(ans[c][d]-x)<1e-5){
					printf("%d %d\n",c,d);fg=1;break;
				}
			}
			if(fg) break;
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值