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