簡體   English   中英

雙浮點精度

[英]Double float point precision

我正在用高斯-賽德爾(Gauss-Seidel)方法求解拉普拉斯方程,但在某些地區,其表現出平穩的狀態。 形式上,即通過數值分析,即使梯度幾乎為零,也不應該存在這樣的區域。

我不得不相信雙精度不足以執行算術運算,並且需要使用大量的數字庫(這會降低性能,因為現在它將由軟件來完成)。 或者,我應該以不同的順序進行操作,以保留小數點的重要性。

單元(13、14、0)正在通過7點網格(在3D模式下)進行更新,其相鄰單元為:

(12,14,0)=  0.9999999999999936; // (x-)
(14,14,0)=  0.9999999999999969; // (x+)
(13,13,0)=  0.9999999999999938; // (y-)
(13,15,0)=  1.0000000000000000; // (y+)
(13,14,-1)= 1.0000000000000000; // (z-)
(13,14,1)=  0.9999999999999959; // (z+)

因此,單元格(13,14,0)的新值將評估為:

p_new = (0.9999999999999936 + 0.9999999999999969 + 0.9999999999999938 + 1.0000000000000000 + 1.0000000000000000 + 0.9999999999999959) / 6.0 ;

導致p_new為1.0000000000000000,而應為0.9999999999999966。

#include <stdio.h>

int main()
{
    double ad_neighboor[6] = {0.9999999999999936, 0.9999999999999969,
                              0.9999999999999938, 1.0000000000000000,
                              1.0000000000000000, 0.9999999999999959};

    double d_denom = 6.0;

    unsigned int i_xBackward=0;
    unsigned int i_xForward=1;

    unsigned int i_yBackward=2;
    unsigned int i_yForward=3;

    unsigned int i_zBackward=4;
    unsigned int i_zForward=5;

    double d_newPotential = (ad_neighboor[i_xForward] + ad_neighboor[i_xBackward] +
                             ad_neighboor[i_yForward] + ad_neighboor[i_yBackward] +
                             ad_neighboor[i_zForward] + ad_neighboor[i_zBackward] ) / d_denom;

    printf("%.16f\n", d_newPotential);
}

由於您正在解決:

d²(phi)/dx² + d²(phi)/dy² = 0

相反,您可以解決等效問題:

d²(phi')/dx² + d²(phi')/dy² = 0

其中, phi' = phi - 1

切記以phi'為單位應用邊界條件。

最終,在解決方案收斂之后,您可以得到phi = 1 + phi'的解決方案。

我在這里假設邊界值接近1。

我沒有嘗試過,但我認為數字將以浮點數表示法的有效數字表示,因此可以減少截斷錯誤。

對於平台上的雙精度浮點類型,您的粒度太好了。

在大多數情況下,您可以通過調整粒度來解決此問題。 如果您需要任何令人信服的效果,那么15個有效的粒度就足以使太陽系以1厘米長的正方形與軌道或冥王星嚙合! 對於這種方法,我傾向於保留至少四個數量級以消除數字噪聲。

僅在極少數情況下,您才應該考慮切換到另一種數據類型,例如long double (如果與平台的double不同)或任意精度類型。

暫無
暫無

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

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