как решить проблему cos 90 в java? [дубликат]
этот вопрос уже есть ответ здесь:
- математика с плавающей запятой сломана? 27 ответов
У меня есть некоторые проблемы с вычислением 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));
}
}