Округление программы Unit Circle - PullRequest
0 голосов
/ 13 мая 2018

Я прохожу онлайн-курс и должен создать такую ​​программу:

В этой программе мы будем практиковаться в использовании класса Math, вычисляя некоторые важные значения на единичном круге. Начиная с 0 и поднимаясь вверх PI / 4 радиана (или 45 градусов), распечатайте информацию в формате ниже.

Radians: (cos, sin)
0.0: 1.0, 0.0
0.79: 0.7, 0.71
1.57: 0.0, 1.0
2.36: -0.71, 0.7
3.14: -1.0, 0.0
3.93: -0.7, -0.71
4.71: 0.0, -1.0
5.5: 0.71, -0.71

Советы:

Вам нужно использовать методы Math.sin, Math.cos. и константа Math.PI! Вам также нужно будет цикл от 0 до 2 * PI

Моя программа выглядит так:

public class UnitCircle extends ConsoleProgram
{
    public void run()
    {
        System.out.println("Radians: (cos, sin)");
        for(double i = 0; i <= 2 * Math.PI; i += Math.PI / 4)
        {
            i = Math.round(i * 100) / 100.0;
            double cos = Math.cos(i);
            cos = Math.round(cos * 100) / 100.0;
            double sin = Math.sin(i);
            sin = Math.round(sin * 100) / 100.0;
            System.out.println(i + ": " + cos + ", " + sin);
        }
    }
}

Но когда я запускаю его, вот что я получаю:

Radians: (cos, sin)
0.0: 1.0, 0.0
0.79: 0.7, 0.71
1.58: -0.01, 1.0
2.37: -0.72, 0.7
3.16: -1.0, -0.02
3.95: -0.69, -0.72
4.74: 0.03, -1.0
5.53: 0.73, -0.68

Я не знаю, как это исправить. Я подозреваю, что у меня проблема с округлением чисел, но я не знаю, как это исправить.

1 Ответ

0 голосов
/ 13 мая 2018

Существует несколько проблем, ни одна из которых не является основной.

i = Math.round(i * 100) / 100.0;

Вы изменяете переменную индекса цикла внутри цикла, что является плохой практикой.

Во-вторых, вы округляетепеременная индекса, которая вызывает несоответствие между вашими фактическими и ожидаемыми результатами.Например, в начале второй итерации значение i отличается от π / 4 на бесконечно малую величину (одна часть примерно в 10 14 , но когда вы округляете i, вы 'мы урезали его до 0.79, что совсем немного. Используя это, вы добавляете больше ошибок каждый раз.

Чтобы решить проблему, не округляйте i (не изменяйте ее ви выполнять все вычисления с полной точностью (т.е. не округлять промежуточные числовые значения).

Концептуально, вы хотите полностью отделить вычисление от отображения . Всегда выполняйте вычисления с максимально возможной точностью и применяйте округление или усечение только при визуализации результатов для печати. ​​

Обратите внимание, что вы можете все еще получить некоторые противоречивые результаты в некоторыхкрайние случаи. Если вы собираетесь работать с числами с плавающей запятой, вы ДОЛЖНЫ прочитать Что каждый ученый-компьютерщик должен знать о плавающей точкеt Арифметика и С плавающей точкой не работает?

...