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);
		}
	}
}


你可能感兴趣的:(log,calculator,FZU,2036)