gpt4 book ai didi

java - NumberFormatException:无限或 NaN

转载 作者:搜寻专家 更新时间:2023-11-01 01:53:35 25 4
gpt4 key购买 nike

我有一个接受 n 并返回第 n 个斐波那契数的方法。在方法实现中,我使用 BigDecimal 获取第 n 个斐波那契数,然后使用方法 toBigInteger() 将数字作为 BigInteger 对象获取,然后那肯定是因为我在我的应用程序中处理大量数据。

在将 1475 作为我的方法的参数传递之前,我一直得到正确的结果。在这种情况下,我得到了 NumberFormatException: Infinite or NaN,但没有任何明确的理由。

您能解释一下为什么会出现此异常吗?

这是我的方法:

BigInteger getFib(int n){
double phi = (1 + Math.sqrt(5))/2;
double squareRoot = (Math.sqrt(5)) + (1/2);
BigDecimal bd = new BigDecimal(Math.floor(Math.pow(phi, n)/(squareRoot)));
return bd.toBigInteger();
}

最佳答案

您的 Math.pow(phi, n) 太大(Infinity),double 无法存储它,请改用 BigDecimal。

流动性如何:

static BigInteger getFib(int n) {
BigDecimal x1 = new BigDecimal((1 + Math.sqrt(5)) / 2);
BigDecimal x2 = new BigDecimal((1 - Math.sqrt(5)) / 2);
return x1.pow(n).subtract(x2.pow(n))
.divide(new BigDecimal(Math.sqrt(5))).toBigInteger();
}

来自公式:enter image description here

更新:上面的方式是不正确的,因为 Math.sqrt(5) 没有像评论说的那样具有足够的精度。我尝试使用 Netown 的方法更精确地计算 sqrt(5),并发现 x1.pow(n).subtract(x2.pow(n)).divide(...) 非常耗时,在我的电脑上 n = 200 花了大约 30 秒。

我认为使用缓存的递归方式更快:

    public static void main(String[] args) {
long start = System.nanoTime();
System.out.println(fib(2000));
long end = System.nanoTime();
System.out.println("elapsed:"+ (TimeUnit.NANOSECONDS.toMillis(end - start)) + " ms");
}

private static Map<Integer, BigInteger> cache = new HashMap<Integer, BigInteger>();

public static BigInteger fib(int n) {
BigInteger bi = cache.get(n);
if (bi != null) {
return bi;
}
if (n <= 1) {
return BigInteger.valueOf(n);
} else {
bi = fib(n - 1).add(fib(n - 2));
cache.put(n, bi);
return bi;
}
}

当 n = 2000 时,它在我的计算机上花费了 7 毫秒。

关于java - NumberFormatException:无限或 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028454/

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