簡體   English   中英

在Java中使用double計算圓錐台側面時如何處理浮點精度

[英]How to deal with floating-point accuracy when calculating the lateral surface of a frustum cone using double in Java

我正在嘗試使用下面的代碼來計算平截頭圓錐體的側面。

輸入:2個包含x,y,z值(絕對位置)和半徑(位置半徑)的節點都加倍

到目前為止,我正在做什么:
1.計算錐台的長度
2.計算平截頭錐體的側面

我的問題:
假設減去2個具有相似大小的浮點數會由於精度損失而出現問題。 (我沒有遇到問題)

我的問題:
我該怎么做才能改善最終結果?

我發現/想到的可能性:
-使用BigDecimal(由於運行時間較長,我不想這么做)
-用r1 ^ 2替換(r1-r2)*(r1-r2)-2 * r1 * r2 + r2 ^ 2
-檢查兩個double值的接近程度,如果非常接近,則假定它們的差值為0。這是否還能提高最終結果的准確性? 減法的結果的絕對誤差是否比假設為0的絕對誤差小?

public static double calculateLateralSurface(Node node1, Node node2) {
    double x, y, z, length, r1, r2, lateralSurface;

    // calculate length of frustum cone
    x = node1.getPosX() - node2.getPosX();
    y = node1.getPosY() - node2.getPosY();
    z = node1.getPosZ() - node2.getPosZ();
    length = Math.sqrt(x * x + y * y + z * z);
    r1 = node1.getRadius();
    r2 = node2.getRadius();

    // calculate lateral surface of frustum cone
    lateralSurface = (r1+r2)*Math.PI*Math.sqrt((r1-r2)*(r1-r2)+length*length);
    return lateralSurface;
}

我希望有一個人可以幫助我 :)

對於任何實際甚至不是實際使用, double都具有足夠的精度。 因此,除非您的圓錐體描述了從地球一直到半人馬座星系的光學望遠鏡的視場,否則您應該沒有任何精度問題。

我可以向您指出,您正在計算length是將平方根僅在以后使用之前再平方一次,因此消除不必要的計算對可能會有所改善,但是我懷疑這是您的問題。

因此,如果您的結果看起來不正確,則可能是應歸咎於錯誤而不是double的精度。

無論如何,為什么不提供一個獨立的,可編譯的示例,以及實際輸入值,實際輸出值以及您的期望值,我們將對此進行更深入的研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM