【问题标题】:Java Test Number for its precisionJava 测试编号的精度
【发布时间】:2011-12-14 18:51:04
【问题描述】:


我必须编写一个方法,在不使用 Math.atan() 的情况下计算 ArcTan
我的算法正在运行,但它并没有停止。

public final static double EPSILON = 1E-16; // Given Value 0,00000000000000010000
public static void main(String[] args)
{   
    double arcTan = formula;

    while(Math.abs(arcTan) < EPSILON)
    {
       ...myAlgorythm...    
    }
}

经过 23 次循环后,我的算法计算出的 arcTan 与 Math.atan() 几乎相同,但我的 while 并没有停止。
如何以正确的方式指定停止条件?

为了更好地理解,请参阅我的循环的输出:

1:  0,45833333333333330000  0,00000000000000010000
2:  0,46458333333333330000  0,00000000000000010000
3:  0,46346726190476184000  0,00000000000000010000
4:  0,46368427579365074000  0,00000000000000010000
5:  0,46363988658910527000  0,00000000000000010000
6:  0,46364927661314370000  0,00000000000000010000
7:  0,46364724210793534000  0,00000000000000010000
8:  0,46364769089584895000  0,00000000000000010000
9:  0,46364759050907880000  0,00000000000000010000
10: 0,46364761321561010000  0,00000000000000010000
11: 0,46364760803259750000  0,00000000000000010000
12: 0,46364760922469040000  0,00000000000000010000
13: 0,46364760894874296000  0,00000000000000010000
14: 0,46364760901297210000  0,00000000000000010000
15: 0,46364760899795077000  0,00000000000000010000
16: 0,46364760900147850000  0,00000000000000010000
17: 0,46364760900064694000  0,00000000000000010000
18: 0,46364760900084356000  0,00000000000000010000
19: 0,46364760900079693000  0,00000000000000010000
20: 0,46364760900080804000  0,00000000000000010000
21: 0,46364760900080537000  0,00000000000000010000
22: 0,46364760900080600000  0,00000000000000010000
23: 0,46364760900080580000  0,00000000000000010000
24: 0,46364760900080587000  0,00000000000000010000
25: 0,46364760900080587000  0,00000000000000010000
26: 0,46364760900080587000  0,00000000000000010000
27: 0,46364760900080587000  0,00000000000000010000
28: 0,46364760900080587000  0,00000000000000010000
29: 0,46364760900080587000  0,00000000000000010000
30: 0,46364760900080587000  0,00000000000000010000

第一列是我的计数器变量 n
第 2 列是我计算的 arcTan - 你看它在循环 23 之后并没有变得更精确
第 3 列是我的 Epsilon

如何检查我的第二列是否具有第三列中指定的精度?

【问题讨论】:

  • 您必须指定算法中的 n 会发生什么。
  • 忘记 n - 对不起。那只是为了让循环停止......(在每个循环中,n 都加 1)
  • 也许放一个带中断的 if 语句来退出循环?
  • 对不起——我只需要检查一个中间结果的精度——不是我的棕褐色。问题可以删除

标签: java precision epsilon


【解决方案1】:

也许你需要改变

while(Math.abs(arcTan) < EPSILON || n < 70)

while(Math.abs(arcTan) < EPSILON && n < 70)

但在不知道循环内部发生了什么的情况下不会知道。

编辑:可能是这样的

public final static double EPSILON = 1E-16; // Given Value 0,00000000000000010000
public static void main(String[] args)
{   
    double arcTan = formula;
    double previous = 0, current;

    while(n<70)
    {
        current = ...myAlgorythm...

        if (current - previous < EPSILON)
            break;
        else
            previous = current;
    }
}

【讨论】:

  • 忘记 n - 对不起。那只是为了让循环停止......(在每个循环中,n 都加 1)
【解决方案2】:

您需要计算Math.atan 的结果与您自己的计算结果之间的差异(并将其与 epsilon 进行比较):

double arcTan = Math.atan(myValue);

while(Math.abs(arcTan - myArcTan) >= EPSILON && n < 70) {
    ...
}

编辑:将 || 替换为 &amp;&amp; 与其他答案一样。

【讨论】:

  • 忘记 n - 对不起。那只是为了让循环停止......(在每个循环中,n 都加 1)
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 2019-02-10
  • 2020-12-17
  • 1970-01-01
  • 2021-06-15
  • 2018-12-30
  • 2020-07-08
  • 2016-10-01
相关资源
最近更新 更多