Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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,我制作了一个类Location,它允许设置、更改位置坐标x、y,限制由xMin、xMax、yMin、yMax决定,以计算两点之间的距离,并从另一个位置获得方向。 该方向与另一位置的距离为[0,2pi]度。 方向是从北开始的,假设北极是有较高坐标的磁极,按顺时针顺序 package TruckingCompany; public class Location { private double x; private double y; private static fin

我制作了一个类Location,它允许设置、更改位置坐标x、y,限制由xMin、xMax、yMin、yMax决定,以计算两点之间的距离,并从另一个位置获得方向。 该方向与另一位置的距离为[0,2pi]度。 方向是从北开始的,假设北极是有较高坐标的磁极,按顺时针顺序

package TruckingCompany;

public class Location 
{
    private double x;
    private double y;
    private static final double xMax=1000.0;
    private static final double xMin=-1000.0;
    private static final double yMax=1000.0;
    private static final double yMin=-1000.0;
    public Location()
    {
        setX(0.0);
        setY(0.0);
    }
    public Location(double x,double y)
    {
        setX(x);
        setY(y);
    }
    public Location(Location location)
    {
        setX(location.getX());
        setY(location.getY());
    }
    public void setX(double x)
    {
        if(x>=xMin && x<=xMax)
        this.x=x;
    }
    public void setY(double y)
    {
        if(y>=yMin && y<=yMax)
            this.y=y;
    }
    public void set(double x,double y)
    {
        setX(x);
        setY(y);
    }
    public double getX()
    {
        return x;
    }
    public double getY()
    {
        return y;
    }
    public double getDistanceFrom(Location from)
    {
        double dx,dy;
        dx=from.getX()-x;
        dy=from.getY()-y;
        return Math.sqrt(Math.pow(dx, 2.0)+Math.pow(dy, 2.0));
    }
    public double getDirectionFrom(Location from)
    {
        double dy=from.getY()-y;
        double direction=Math.PI/4 - Math.asin  (Math.toRadians(dy/getDistanceFrom(from)));
        if(Double.isNaN(direction)==false)
        {
            if(from.getX()-x<0.0)
            direction+=Math.PI/2;
             if(dy<0.0)
                direction+=Math.PI;
        }
        return direction;
    }
    @Override
    public String toString()
    {
        return "(" + x + " , " + y + ")";
    }
}

问题是精度:在本例中,它打印44.29度,应该是45.0度,为什么精度损失如此之大?

您接近45度,这意味着您将接近某些触发函数的最大值和最小值。我会检查这些步骤,看看是否得到非常接近0的中间结果

尝试用dx*dx和dy*dy替换对pow的调用

用中间结果将其分解


使用Math.atan2deltaX、deltaY以弧度为单位计算向量的角度。它返回从0到2*Math.PI的所有答案,而不必根据输入的符号进行个案工作。

旁注:你不能只使用Math.atan2吗?你得到了0,0->0300和0,0->300,0的预期结果吗?耶!我有一个数字问题!拿着,我的数值分析教授们-为什么要用dx*dx替换pow,这不一样吗?不,通常不一样,因为pow必须能够处理任何浮动组合,如pow3.14159、2.71828。从数学上讲,它们看起来是一样的;实际的计算可能涉及到一些类似于记录参数的内容,这会导致精度下降。参数的位不是被复制的一样吗?也许一次额外的乘法会产生不同。拉米,这不是复制的位,而是指数的计算方式。dx是一个乘法。一般的求幂运算类似于expln x*ln x,在所有三个函数调用中都有各种数字魔术。现在,我不知道这是这个案例中的一个因素,但我很确定它既慢又不精确。
Location l1,l2;
l1=new Location(0.0,0.0);
l2=new Location(300.0,300.0);
System.out.print(Math.toDegrees(l1.getDirectionFrom(l2)));