gpt4 book ai didi

java - 精度损失乘以大长

转载 作者:行者123 更新时间:2023-11-30 09:01:54 27 4
gpt4 key购买 nike

我正在研究本质上是斐波那契数列的问题陈述:

给定两个初始值作为输入,您可以计算项 x = (项 x-1)^2 + (项 x-2)

因此,给定输入 0 1 5,我们要计算序列的第 5 项,这是通过以下方式完成的:

第 3 项 =(第 2 项)^2+(第 1 项)= 1^2 + 0 = 1

第 4 项 =(第 3 项)^3+(第 2 项)= 1^1 + 1 = 2

第 5 项 = 2^2+1 = 5

等等。

当我尝试计算一个很大的值时,比如第 10 个,我的问题就来了。使用 long 作为我的数据类型,我在第 10 个值处精确地丢失了精度。预期/正确的值为`84266613096281243382112,但我得到..

0 1 10
Term number 3 has value 1
Term number 4 has value 2
Term number 5 has value 5
Term number 6 has value 27
Term number 7 has value 734
Term number 8 has value 538783
Term number 9 has value 290287121823
Term number 10 has value 1886167576011600224

使用 double 作为我的数据类型来做同样的问题却给了我正确的答案,但不是我需要的格式(这是一个自动化测试用例)。

0 1 10
Term number 3 has value 1.0
Term number 4 has value 2.0
Term number 5 has value 5.0
Term number 6 has value 27.0
Term number 7 has value 734.0
Term number 8 has value 538783.0
Term number 9 has value 2.90287121823E11
Term number 10 has value 8.426661309628124E22

为什么我会遇到 long 的这种精度损失,我该如何防止它/获得我想要的输出?

最佳答案

尝试使用 BigInteger 类,它有效:

import java.math.BigInteger;

public class Test {

public static void main(String[] args) {
BigInteger x1, x2, x3;

x1 = new BigInteger("0");
x2 = new BigInteger("1");

for (int i = 3; i <= 10; i++){
x3 = x2.multiply(x2).add(x1);
System.out.println(i + ":" + x3);
x1 = x2;
x2 = x3;
}
}

}

关于java - 精度损失乘以大长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com