[英]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
將為4
, floor
將為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.