2

您好,我对 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)

4

3 回答 3

1

鉴于您的结果,我认为dy等于0.1

你的结果没有错。如果你有,0.3 < p.y < 0.4那么你将拥有3 < p.y/dy < 4如此的ceil意志4floor意志3

也许您感到困惑,因为您在代码中的其他地方设置p.y为 0.3 或 0.4。你应该知道浮点数不是那么精确。这意味着即使您设置p.y = 0.3它也可以具有值0.30000001或类似的值,从而导致您的问题。

于 2013-03-08T10:24:49.273 回答
1

当你使用浮点运算时,你通常不应该依赖结果是一个整数,因为浮点计算不精确。您可能需要重新设计您的代码,使其不依赖于此。

这是浮点运算的经典讨论

于 2013-03-08T10:24:14.370 回答
-1

这看起来就像浮点运算的舍入错误。

最后一种情况的结果可能是 3.00000000000001,所以它的上限是 4 而不是 3(然后乘以 0.1)

于 2013-03-08T10:24:29.840 回答