N = 16260595201356777876687102055392856230368799478725437225418970788404092751540966827614883675066492383688147288741223234174448378892794567789551235835087027626536919406320142455677084743499141155821894102610573207343199194327005172833989486958434982393556326206485954223151805798621294965926069728816780985683043030371485847746616146554612001066554175545753760388987584593091716701780398711910886679925612838955858736102229719042291682456480437908426849734556856917891628730543729446245974891735371991588505429152639045721840213451875487038496578525189542369448895368117152818687795094021869963915318643663536132393791
delta = 0.26
X = 2*floor(N^delta) # in sage, ^ operator means exponentiation
# similar to ** operator in python
print("X:" + str(x))
产出:
X:328038992702970706211939772107312345642601118998973048120536737057232525258231239351958928823123935195835195825258231239835195825862586158258615825861586158615861586158615861586158615861586158615861586158615861586158615861586158615861586158615861586158615861586158615861086118610861086118610861086
魔法是什么?圣人是怎么做到的?如何将此代码转换为Java(并能够得到类似的结果),应该有一些解决方案。
您可以使用方法#1和一个变通方法。问题是bigfunctions.ln()
对于整数部分(小数点左边的位数)较大的数字不是很有效。作为解决办法,我缩放了这个数字,使它在整数部分中最多包含一个数字,然后通过在exp()
的参数中添加ln(10)*rescale*delta
来补偿这个数字。
您还应该注意使用new BigDecimal(double)
构造函数会导致精度损失-请阅读javadoc以获得解释。相反,您应该使用new BigDecimal(String)
(特别是当double来自某种配置值时),或者BigDecimal.valueof(double)
。
BigInteger N = new BigInteger("16260595201356777876687102055392856230368799478725437225418970788404092751540966827614883675066492383688147288741223234174448378892794567789551235835087027626536919406320142455677084743499141155821894102610573207343199194327005172833989486958434982393556326206485954223151805798621294965926069728816780985683043030371485847746616146554612001066554175545753760388987584593091716701780398711910886679925612838955858736102229719042291682456480437908426849734556856917891628730543729446245974891735371991588505429152639045721840213451875487038496578525189542369448895368117152818687795094021869963915318643663536132393791");
double delta = 0.26;
// this scale is sufficient to get the exact integer part
// it is roughly equal to the number of digits in the result's integer part
final int SCALE = 170;
BigDecimal x = new BigDecimal(N);
BigDecimal y = BigDecimal.valueOf(delta);
int maxIntDigits = 1;
int intDigits = x.precision() - x.scale();
int rescale = Math.max(intDigits - maxIntDigits, 0);
BigDecimal rescaledX = x.scaleByPowerOfTen(-rescale);
BigDecimal z = BigFunctions.exp(
BigFunctions.ln(rescaledX, SCALE)
.add(BigFunctions.ln(BigDecimal.TEN, SCALE).multiply(BigDecimal.valueOf(rescale)))
.multiply(y),
SCALE)
.html" target="_blank">setScale(0, BigDecimal.ROUND_FLOOR)
.multiply(BigDecimal.valueOf(2));
System.out.println(z);
产出:
32803899270296656086551107648280231830313861082788744611797945239672375099902513857958219091523648839375388564236289659519690404775361188478777234501437677352644
sage 是一款由华盛顿大学开发的类似于 matlab/mathematica,并且整合了很多已有的开源软件包的开源数学软件。目前只有 Linux 和 MacOS 版,Windows 下可通过 vmware player 运行,不过你也可以直接在线使用。 sage 的功能是很强大的,介绍中有这么一句:“这款开源软件的支持者称 Sage 能够完成任何事情,从 1 2 维物体到计算全球变暖效应数学模型
描述 (Description) java.math.BigInteger.modPow(BigInteger exponent, BigInteger m)返回一个BigInteger,其值为(this exponent mod m)。 与pow不同,此方法允许负指数。 声明 (Declaration) 以下是java.math.BigInteger.modPow()方法的声明。 public
问题内容: 在Java中,大多数基本类型都是带符号的(一位用于表示+/-),因此当我超出类型的限制时,我会得到意外的结果,例如负数。 有什么比使用BigInteger更好的解决方案了,因为BigInteger存在性能问题,并且您需要对基本算术使用类方法而不是语言运算符(以提高可读性)? 问题答案: 不,没有更好的解决方案。如果您使用的值不能为长整型或双精度型,那么您将需要使用诸如的引用类型,并且J
描述 (Description) java.math.BigInteger.xor(BigInteger val)返回一个BigInteger,其值为(this ^ val)。 当且仅当this和val中的一个为负时,此方法返回负BigInteger。 声明 (Declaration) 以下是java.math.BigInteger.xor()方法的声明。 public BigInteger xo
描述 (Description) java.math.BigInteger.subtract(BigInteger val)返回一个BigInteger,其值为(this - val)。 声明 (Declaration) 以下是java.math.BigInteger.subtract()方法的声明。 public BigInteger subtract(BigInteger val) 参数 (
描述 (Description) java.math.BigInteger.remainder(BigInteger val)返回一个BigInteger,其值为(this%val)。 声明 (Declaration) 以下是java.math.BigInteger.remainder()方法的声明。 public BigInteger remainder(BigInteger val) 参数