你好,我在使用 C++ 中的 ceil 函数时遇到了一些困难:
我有一个规则的点网格,我需要对其执行插值以计算一组点的 z 值。
为此,我需要为每个计算点获取网格上最近的点。我这样做:
y1 = dy*floor(p.y/dy);
y2 = dy*ceil(p.y/dy);
其中 dy 是网格两点之间的空间。 (y1、p.y 和 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。 p.y 是这样初始化的:
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 < p.y < 0.4
那么你将拥有3 < p.y/dy < 4
所以 ceil
将是 4
和 floor
将是 3
.
也许您感到困惑,因为您在代码的其他地方设置了 p.y
到 0.3 或 0.4。您应该知道 float 不是那么精确。这意味着即使你设置p.y = 0.3
它的值可以是 0.30000001
或类似的东西,导致您的问题。
关于c++ - C++中奇怪的天花板错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15291665/