如何在Java中更正三角函数的不精确性?
我试图用蒙特卡罗方法计算一个有200个边的多边形的面积。我知道我的代码是正确的,这只是一个三角形的例子,但由于Java在计算Math.cos函数时出错,它非常不精确。有人知道如何在不使用额外类的情况下修复它吗?我还没有学习面向对象的Java?或者告诉我误差有多大?这样我就不用把sum>359放在末尾了?非常感谢你的帮助如何在Java中更正三角函数的不精确性?,java,Java,我试图用蒙特卡罗方法计算一个有200个边的多边形的面积。我知道我的代码是正确的,这只是一个三角形的例子,但由于Java在计算Math.cos函数时出错,它非常不精确。有人知道如何在不使用额外类的情况下修复它吗?我还没有学习面向对象的Java?或者告诉我误差有多大?这样我就不用把sum>359放在末尾了?非常感谢你的帮助 import java.util.Random; import java.util.Date; import java.util.Scanner; public class
import java.util.Random;
import java.util.Date;
import java.util.Scanner;
public class polygon {
public static void main(String args[]) {
Random ran = new Random();
Scanner a=new Scanner(System.in);
int side=3;
double dentro = 0;
double fuori = 0;
double x [] = {3,4,5};
double y [] = {1,6,3};
double lengthtopoint[]=new double [side];
double sidelength[]=new double [side];
double angles[]=new double [side];
for (int s =0; s< 1000000; s++){
double xcheck = ran.nextDouble()*10;
double ycheck = ran.nextDouble()*10;
for(int i=0;i<side;i++) {
lengthtopoint[i]=Math.sqrt(((x[i]-xcheck)*(x[i]-xcheck))+((y[i]-ycheck)*(y[i]-ycheck)));
}
for(int k=0;k<side-1;k++) {
sidelength[k]=Math.sqrt(((x[k+1]-x[k])*(x[k+1]-x[k]))+((y[k+1]-y[k])*(y[k+1]-y[k])));
}
sidelength[side-1]=Math.sqrt(((x[0]-x[side-1])*(x[0]-x[side-1]))+((y[0]-y[side-1])*(y[0]-y[side-1])));
for(int l=0;l<side-1;l++) {
angles[l] =((180/(Math.PI)))*Math.acos(((lengthtopoint[l]*lengthtopoint[l])+(lengthtopoint[l+1]*lengthtopoint[l+1])-(sidelength[l]*sidelength[l]))/(2*lengthtopoint[l]*lengthtopoint[l+1]));
}
angles[side-1] =((180/(Math.PI)))*Math.acos(((lengthtopoint[side-1]*lengthtopoint[side-1])+(lengthtopoint[0]*lengthtopoint[0])-(sidelength[side-1]*sidelength[side-1]))/(2*lengthtopoint[side-1]*lengthtopoint[0]));
double sum=0;
for(int m=0;m<side;m++) {
sum=sum+angles[m];
}
if (sum>359) {
dentro = dentro+1;
} else {
fuori = fuori + 1;
}
}
double Area = (dentro*100/(dentro+fuori));
System.out.println(Area);
}
}
如果总和>180,则替换为
如果你以无限的精度计算一切,你会得到一个k*360形式的数字。如果你没有,那么你应该把它四舍五入到最接近的数字,可以被360整除。如果你得到358,你的程序认为是0,但它也必须是360。在这种形式下,这个问题更适合。请考虑你的问题,使它匹配。由于java在计算Mth.CoS函数中的错误,那么这个错误会是什么?java比你在代码中有一个错误的可能性少了二十年,根本没有被注意到的基本数学错误。如果你真的认为一个数学函数有错误,那么写一个简短的程序来演示它,并在你的问题中包含这些代码。
if (sum>359)