簡體   English   中英

C ++中的奇怪上限錯誤

[英]Strange ceiling error in c++

您好,我在c ++中的ceil函數有一些困難:

我有一個規則的點網格,我需要對其進行插值以計算一組點的z值。

為此,對於每個計算點,我都需要獲取網格上最接近的點。 我這樣做是這樣的:

y1 = dy*floor(p.y/dy);
y2 = dy*ceil(p.y/dy);

dy是網格兩點之間的空間。 (y1,py和dy是雙精度的)如果我使用

cout << static_cast<double>(p.y/dy) << ": " << y1 << ", " << y2 << endl;

我得到了這些奇怪的結果:

0: 0, 0
1: 0.1, 0.1
2: 0.2, 0.2
3: 0.3, 0.4

前三個結果都可以,但最后一個是錯誤的,因此斷言失敗。

我想知道這個奇怪的錯誤發生在哪里以及如何避免它。 謝謝。

我為我的英語道歉

編輯

我用dy = 0.1調用該函數,但是在執行過程中,它采用以下值dy = 0.10000000000000001。 py像這樣初始化:

 const uint N = round((x2 - x1) / dx2);
 const uint M = round((y2 - y1) / dy2);

 double p = persistence;
 double n = number_of_octaves;

 // generation of the points where the perlin noise is generated
 std::vector<Vertex3d> ret;
 std::vector<Vertex3d> dummy;
 for (uint i=0;i<=N;++i)
 {
        for (uint j=0;j<=M;++j)
        {
                ret.push_back({.x = i*dx2, .y=j*dy2, .z=0});
                dummy.push_back({.x = i*dx2, .y=j*dy2, .z=0});
        }
 }

其中x1 = 0和x2 = 1(根據gdb)

使用浮點算術時,由於浮點計算的不精確性,通常不應將結果完全依賴於整數。 您可能需要重新設計代碼,以使其不依賴於此。

這是浮點算術經典討論

給定您的結果,我認為dy等於0.1

您的結果沒有錯。 如果您的0.3 < py < 0.4那么您將有3 < py/dy < 4因此, ceil將為4floor將為3

也許您很困惑,因為您在代碼的其他位置將py設置為0.3或0.4。 您應該知道浮動不是那么精確 這意味着即使您將py = 0.3設置為0.30000001或類似的值, 0.30000001導致問題。

這看起來就像是浮點運算的舍入誤差的情況。

可能是最后一種情況的結果是3.00000000000001,因此其上限是4而不是3(然后乘以0.1)

暫無
暫無

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

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