Fzu 2036 Log Calculator(JAVA 浮点数输出精度控制)

Java高精度题:

给定a,b,求s=log2(2a+2b);


解析:

a>b
a=log2(x)   x=2^a
b=log2(y)   y=2^b

log2(x+y) = b+log2(1+2^(a-b));

在a-b > 32时,log2(1+2^(a-b)) 近似等于 log2(2^(a-b))


总结:之前对于Java的高精度不太熟练,通过这题加强了Java高精度的练习,

还有本来这题还是可以做出来的,因为没有听方敏霞同学,话没完成这题,留此句以警示自己。


import java.util.Scanner;
import java.math.*;

public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int t , cas = 1;
		BigDecimal a,b,sum,beta;
		t = cin.nextInt();
		while(t-- != 0) {
			a = cin.nextBigDecimal();
			b = cin.nextBigDecimal();
			if(a.compareTo(b) > 0) {
				BigDecimal tmp = a;
				a = b;
				b = tmp;
			}
			beta = a.subtract(b);
			if(beta.compareTo(BigDecimal.valueOf(32)) > 0) {
				sum = b.add(beta);
			}else {
				double x = beta.doubleValue();
				double cnt = Math.pow(2.0, x) + 1;
				double s = Math.log(cnt) / Math.log(2.0);
				sum = b.add(BigDecimal.valueOf(s));
			}
			sum = sum.setScale(9, BigDecimal.ROUND_HALF_UP);
			System.out.println("Case " + (cas++) + ": "+sum);
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值