Java Test Number для его точности - PullRequest
       35

Java Test Number для его точности

0 голосов
/ 25 октября 2011


Я должен написать метод, который вычисляет ArcTan без использования Math.atan ()
Мой алгоритм работает, но он не останавливается.

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 (), но мое время не останавливается.
Как правильно указать стоп-условие?

Для лучшего понимания смотрите вывод моего цикла:

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

1-й столбец - это моя переменная-счетчик n
2-й столбец - мой вычисленный arcTan - вы видите, что он не становится более точным после 23 цикла 3-я колонка - мой Эпсилон

Как проверить, есть ли в моем втором столбце прецизионность, указанная в 3-м столбце?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Возможно, вам нужно изменить

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;
    }
}
0 голосов
/ 25 октября 2011

Вам необходимо вычислить разницу между результатом Math.atan и вашим собственным расчетом (и сравнить его с эпсилоном):

double arcTan = Math.atan(myValue);

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

РЕДАКТИРОВАТЬ: заменено || на&& как в другом ответе.

...