不过当表示的数很大时,有效位数好像是会变小了(这个只是我的认为,没有确认) 如果你想精确的,那就直接使用BigInteger啦,这个绝对精确BigInteger result = BigInteger.ONE; BigInteger tow = BigInteger.valueOf(2); for(int i = 1; i <= 128; i++) { result = result.multiply(two); }
你试试这个 BigDecimal b = new BigDecimal(2); for (int i = 0; i < 126; i++) { b=b.multiply(new BigDecimal(2)); } System.out.println(b); }
你试试这个 BigDecimal b = new BigDecimal(2); for (int i = 0; i < 126; i++) { b=b.multiply(new BigDecimal(2)); } System.out.println(b); }
是 1<<126
sorry
1<<126等同于1 * (2的126次方)2<<126等同于2 * (2的126次方)
即使是 double 型也只能,存放 2 的64(8*8)次方。
如果要确定到求某一位的话,可以用多个byte数组来存放。用压缩型 bcd 码来存放。
运算法则和平常手工算式乘法相似,但有所不同,需要做调整。
如果是用汇编来实现的话。8086系列cpu有相应的bcd码调整指令。
java vm 好象没有。
如果采用那种方式的话。
整个过程至少需要 9*126次 (乘法&调整) ,
double虽然是64位,但它的范围不是2 的64,而是
double 64 1.7e-308~1.7e+308
浮点数存储与整数不同
用i=1<<126; 的值 1.073741824E9
用Math.pow(2,126) 的值8.507059173023462E37
為什么啊?
85070591730234615865843651857942052864BigInteger base=new BigInteger(new byte[]{2});
BigInteger result=base.pow(126);
(2-2^-52)·2^1023
最小 是2-1074
所以2^126次方还远远没有超过它能够表示的精度
如果你想精确的,那就直接使用BigInteger啦,这个绝对精确BigInteger result = BigInteger.ONE;
BigInteger tow = BigInteger.valueOf(2);
for(int i = 1; i <= 128; i++) {
result = result.multiply(two);
}
BigDecimal b = new BigDecimal(2);
for (int i = 0; i < 126; i++) {
b=b.multiply(new BigDecimal(2));
}
System.out.println(b);
}
BigDecimal b = new BigDecimal(2);
for (int i = 0; i < 126; i++) {
b=b.multiply(new BigDecimal(2));
}
System.out.println(b);
}