Java中使用double计算平截锥侧面时如何处理浮点精度问题

Java中使用double计算平截锥侧面时如何处理浮点精度问题,java,precision,floating-accuracy,geometry-surface,Java,Precision,Floating Accuracy,Geometry Surface,我正试图用下面的代码计算平截头圆锥的侧面 输入:2个节点,包含x、y、z值(绝对位置)和半径(位置处的半径),均为双精度 到目前为止我在做什么: 1.计算平截锥的长度 2.计算平截锥的侧面 我的问题: 由于精度损失,假设2个具有相似大小的浮点数的减法是有问题的。(我没有遇到这个问题) 我的问题: 我能做些什么来提高最终结果 我发现/想到的可能性: -使用BigDecimal(由于运行时间较长,我不想这样做) -将(r1-r2)*(r1-r2)替换为r1^2-2*r1*r2+r2^2 -对两个双精

我正试图用下面的代码计算平截头圆锥的侧面

输入:2个节点,包含x、y、z值(绝对位置)和半径(位置处的半径),均为双精度

到目前为止我在做什么:
1.计算平截锥的长度
2.计算平截锥的侧面

我的问题:
由于精度损失,假设2个具有相似大小的浮点数的减法是有问题的。(我没有遇到这个问题)

我的问题:
我能做些什么来提高最终结果

我发现/想到的可能性:
-使用BigDecimal(由于运行时间较长,我不想这样做)
-将(r1-r2)*(r1-r2)替换为r1^2-2*r1*r2+r2^2
-对两个双精度值的接近程度进行检查,如果非常接近,则假定其差值为0。这会提高我最终结果的准确性吗?减法的结果的绝对误差不是比假定为0的结果小吗

公共静态双计算面(节点1、节点2){
双x,y,z,长度,r1,r2,侧面;
//计算平截锥的长度
x=node1.getPosX()-node2.getPosX();
y=node1.getPosY()-node2.getPosY();
z=node1.getPosZ()-node2.getPosZ();
长度=数学sqrt(x*x+y*y+z*z);
r1=node1.getRadius();
r2=node2.getRadius();
//计算平截锥的侧面
侧向曲面=(r1+r2)*数学PI*数学sqrt((r1-r2)*(r1-r2)+长度*长度);
返回侧面;
}

我希望有人能帮助我:)

double
对于任何实际的甚至不太实际的用途都有足够的准确性。因此,除非你的圆锥体描述了从地球一直到半人马座阿尔法星的光学望远镜的视野,否则你不应该有任何精度问题

我可以向您指出,您是在计算
长度
,方法是先取一个平方根,然后再使用它,这样消除不必要的一对计算可能会在某种程度上改善情况,但我怀疑这是您的问题

因此,如果您的结果看起来不正确,那么可能是错误造成的,而不是
double
的精度


在任何情况下,为什么不提供一个自包含的、可编译的示例,以及实际的输入值、实际的输出值和期望值,我们可以更深入地研究它。

double
对于任何实际的甚至不太实际的使用都有足够的准确性。因此,除非你的圆锥体描述了从地球一直到半人马座阿尔法星的光学望远镜的视野,否则你不应该有任何精度问题

我可以向您指出,您是在计算
长度
,方法是先取一个平方根,然后再使用它,这样消除不必要的一对计算可能会在某种程度上改善情况,但我怀疑这是您的问题

因此,如果您的结果看起来不正确,那么可能是错误造成的,而不是
double
的精度


在任何情况下,为什么不提供一个自包含的、可编译的示例,以及实际的输入值、实际的输出值和期望值,我们可以更深入地研究它。

我认为您只需要接受这样一个事实:您不会得到绝对准确的结果。到底是什么问题?显示a,包括精确的输入(如果它有浮点数,则精确显示它们的值,使用至少足够的数字将值与相邻的可表示值唯一区分)、精确的输出和所需的输出。不,假设两个接近的数的差为零不是一个好主意。如果两个
double
数字接近(每个数字至少是另一个的一半),则减去它们的结果没有错误。结果中出现的任何错误都是在减法之前的操作数中出现的。我认为您只需要接受这样一个事实:您不会得到绝对精确的结果。到底是什么问题?显示a,包括精确的输入(如果它有浮点数,则精确显示它们的值,使用至少足够的数字将值与相邻的可表示值唯一区分)、精确的输出和所需的输出。不,假设两个接近的数的差为零不是一个好主意。如果两个
double
数字接近(每个数字至少是另一个的一半),则减去它们的结果没有错误。结果中出现的任何错误都出现在减法之前的操作数中。很好!没有看到我不必要的长度计算。感谢您提供了一个完整的、可编译的示例:我的问题是假设性的。恐怕我会遇到这个问题,因为我的函数参数变化很大。对不起,我刚意识到我应该在问我的问题,对吗?这种问题适合stackoverflow。很好!没有看到我不必要的长度计算。感谢您提供了一个完整的、可编译的示例:我的问题是假设性的。恐怕我会遇到这个问题,因为我的函数参数变化很大。对不起,我刚意识到我应该在问我的问题,对吗?这种类型的问题适合stackoverflow。