2011-09-19 40 views
2

我有一个Java程序,我必须做的功课,这里是我必须使用的公式:picture of formula。对不起,我不是以英语为母语的人,我不知道这个公式的名字。为这个数学计算有更好的解决方案吗? (Java)

我已经写了这个解决方案:

/* Check: 
* if: j<=3: 
* 
* 1/1+sqrt2=0,414213562 
* 1/sqrt2+sqrt3=0,317837245 
* 1/sqrt3+sqrt4=0,267949192 
*  res= 0,9999999 =~1.0 
*/ 
double sum = 0; 
for (int j = 2; j <= 624; j++) 
{ 
    sum += 1/((Math.sqrt(j) + Math.sqrt(j + 1))); 
} 
double res = 0; 
res = (double)1/(1 + Math.sqrt(2)) + sum; 

System.out.println("Result is: " + res); 

我已经检查的程序j=2j=3,它给了正确的结果(1.0左右)。所以我认为它运作良好。但是,当我试图达到j<=624,我的结果是:24.000000000000014

我怎样才能使结果将在我的计划24.0,而不是24.000000000014?

2.这个数学公式有更好的解决方案/源代码吗?这个公式的英文名字是什么?

+2

+1将其列为作业,但将来请使用作业标签。 – Rob

+0

@blaces:您的链接给我安全错误:“服务器的证书与主机名不匹配。”您的电脑管理员需要修复此问题。 – rossum

回答

6

欢迎来到浮点运算的世界。除非您可以使用代数来重写公式,否则使用更少的术语或更快速地收敛,您的运气不好 - 浮点计算从不确切并累积错误,正如您可以从示例中看到的那样。 (在这种情况下的具体提示:您的术语的格式为X k = 1 /(sqrt(k)+ sqrt(k + 1))尝试乘以分子和分母sqrt(k + 1 ) - sqrt(k))

+3

我明白了。并且谢谢你乘以分子和分母 – blaces

0

第一个问题:使用Math.round(double)函数,它返回double的最接近的整数。

您还可以使用Math.floor(double)来获取小于双精度值的最接近的整数 或math.ceil(double),它返回大于double的最接近的整数。

+0

不是要返回一个整数,重点是要返回尽可能接近预期的结果。如果将系列运行到623而不是624,则不会得到整数结果。 –

+0

我明白... – Sonkey

0

对于java计算,您必须使用BigDecimal。

+1

-1:BigDecimal没有内建的sqrt()操作;它应该怎么知道要使用多少个小数位? –

+0

在BigDecimal上查看srt的帖子:http://stackoverflow.com/questions/1384919/are-there-libraries-for-square-root-over-bigdecimal;在所有情况下使用循环中的双打,即使添加也会导致精确度损失,但BigDecimals – rmk

+0

并非如此,我不同意您的回复评论。除非BigDecimal能够从字面上处理无限精度,否则你是错的。 如果是这样,请将sqrt(2)打印为BigDecimal并让我知道您的计算机打印它需要多长时间。 :P。 –

相关问题