Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中更正三角函数的不精确性?_Java - Fatal编程技术网

如何在Java中更正三角函数的不精确性?

如何在Java中更正三角函数的不精确性?,java,Java,我试图用蒙特卡罗方法计算一个有200个边的多边形的面积。我知道我的代码是正确的,这只是一个三角形的例子,但由于Java在计算Math.cos函数时出错,它非常不精确。有人知道如何在不使用额外类的情况下修复它吗?我还没有学习面向对象的Java?或者告诉我误差有多大?这样我就不用把sum>359放在末尾了?非常感谢你的帮助 import java.util.Random; import java.util.Date; import java.util.Scanner; public class

我试图用蒙特卡罗方法计算一个有200个边的多边形的面积。我知道我的代码是正确的,这只是一个三角形的例子,但由于Java在计算Math.cos函数时出错,它非常不精确。有人知道如何在不使用额外类的情况下修复它吗?我还没有学习面向对象的Java?或者告诉我误差有多大?这样我就不用把sum>359放在末尾了?非常感谢你的帮助

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)