Floating-Point Numbers UVA - 11809

根据题意,可以推断出最大值

v = (1-\frac{1}{2^{M+1}}) * 2^{2^{E-1}} = A * 10^{B}

又因为数字的数值过大,所以可以同时求以10为底的对数,即:

lgv = lg(2^{M+1}-1)-(M+1)*lg2 + (2^{E}-1)*lg2 = lgA + B

根据题目要求

0 \leq M\leq 9

1 \leq E \leq 30

所以可以根据式子

lgv = lgA + B

先求出对应的lgv的值,然后根据式子

lgv = lg(2^{M+1}-1)-(M+1)*lg2 + (2^{E}-1)*lg2

log_{a}b = \frac{log_{c}b}{log_{c}a}

可以推出

E = \frac{​{}\frac{lg(lgv - lg(2^{M+1} - 1) + (M+1)*lg2)} {lg2}{} + 1)}{lg2}

对M由0到9进行遍历,并求出对应的E值(取整数),计算出对应的lgv值与前面的lgv进行比较,若差值较小(取1e-4)则输出对应的M和E,代码如下

#include <iostream>
#include <cmath>
#include <string>

using namespace std;
const double eps = 1e-4;

int main() {
	string line;
	double lg2 = log10(2), A, lgv;
	int B;
	while (cin >> line && line != "0e0") {
		line[line.find('e')] = ' ';
		sscanf(line.c_str(), "%lf%d", &A, &B);
		lgv = log10(A) + B;
		for (int M = 0; M < 10; M++) {
			int E = floor(log10((lgv - log10(pow(2,M+1) - 1) + (M+1)*lg2) / lg2 + 1) / lg2 + 0.5);
			if (fabs(((1<<E)-1)*lg2 - (M+1)*lg2 + log10(pow(2,M+1)-1) - lgv) < eps) {
				printf("%d %d\n", M, E);
				break;
			}
		}
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值