【发布时间】:2016-08-22 13:18:36
【问题描述】:
我有两个方程:x * x - D * y * y = 1 和 x = sqrt(1 + D * y * y)。
两者都是对方的代数操作。
给定 D,我需要求解 x 的最小整数值,以便 y 也是整数。我遍历可能的 y 值,将它们插入第二个等式并测试 x 是否为整数。如果是,我返回 x。
我遇到的问题是当 x、y 和 D 代入第一个方程时,它不等于 1。
这些是一些有问题的值:
1. x=335159612 y=42912791 D=61
2. x=372326272 y=35662389 D=109
我的直觉是java的Math.sqrt方法不会计算这么小的小数,但是BigDecimal没有平方根方法。
我的数学错了吗?如果不是,我该怎么做才能准确计算出 x 和 y?
编辑:这是问题的根源以及测试双精度数是否为自然数的方法。
public static void main(String[] args){
long x = 335159612, D = 61, y = 42912791;
System.out.println(Math.sqrt(D * y * y + 2)); // 3.35159612E8
System.out.println(x * x - D * y * y); // 3
}
public static boolean isNatural(double d){
return d == (int)d;
}
【问题讨论】:
-
向我们展示您用于测试整数的代码。
-
一方面,
sqrt(61 * 42912791 * 42912791)is not an integer。如果您将 sqrt 的结果存储到 long 中,那么它当然看起来像一个整数。 -
事实上,向我们展示代码,所有代码,或展示问题所需的代码。例如,如果您尝试以整数计算
42912791 * 42912791,结果将溢出。
标签: java math floating-point arithmetic-expressions