как решить проблему cos 90 в java? [дубликат]

этот вопрос уже есть ответ здесь:

У меня есть некоторые проблемы с вычислением cosinus 90 в Java с использованием математики.функция cos:

public class calc{
      private double x;
      private double y;

      public calc(double x,double y){
                   this.x=x;
                   this.y=y;
      }

      public void print(double theta){
           x = x*Math.cos(theta);
           y = y*Math.sin(theta);
           System.out.println("cos 90 : "+x);
           System.out.println("sin 90 : "+y);
      }

      public static void main(String[]args){
           calc p = new calc(3,4);
           p.print(Math.toRadians(90));

      }

}

когда я вычисляю cos90 или cos270, это дает мне абсурдные значения. Должно быть 0. Я проверял с 91 или 271, дает около 0, что является правильным.

что я должен сделать, чтобы сделать вывод cos 90 = 0? таким образом, он делает вывод x = 0 и y = 4.

благодарен за советы

3 ответов


то, что вы получаете, скорее всего, очень, очень маленькие числа, которые отображаются в экспоненциальной нотации. Причина, по которой вы их получаете, заключается в том, что pi/2 не совсем представлен в нотации IEEE 754, поэтому нет способа получить точный Косинус 90/270 градусов.


просто запустите свой источник, и он вернется:

cos 90 : 1.8369701987210297E-16
sin 90 : 4.0

Это абсолютно правильно. Первое значение-почти 0. Второй - 4, как и ожидалось.

3 * cos(90°) = 3 * 0 = 0

здесь вы должны прочитать математика.toRadians() документация, в которой говорится:

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

обновление: вы можете использовать, например,MathUtils.round () метод из репозитория Apache Commons и вокруг вывода, чтобы сказать 8 десятичных знаков, например:

System.out.println("cos 90 : " + MathUtils.round(x, 8));

это даст вам:

cos 90 : 0.0
sin 90 : 4.0

попробуйте это:

public class calc
{
    private double x;
    private double y;
    public calc(double x,double y)
    {
        this.x=x;
        this.y=y;
    }
    public void print(double theta)
    {
        if( ((Math.toDegrees(theta) / 90) % 2) == 1)
        {
            x = x*0;
            y = y*Math.sin(theta);
        }
        else if( ((Math.toDegrees(theta) / 90) % 2) == 0)
        {
            x = x*Math.cos(theta);
            y = y*0; 
        }
        else
        {
           x = x*Math.cos(theta);
           y = y*Math.sin(theta); 
        }
        System.out.println("cos 90 : "+x);
        System.out.println("sin 90 : "+y);
    }
    public static void main(String[]args)
    {
        calc p = new calc(3,4);
        p.print(Math.toRadians(90));
    }
}