c++ - C++中奇怪的天花板错误

标签 c++ floating-point ceil

你好,我在使用 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将是 4floor将是 3 .

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

关于c++ - C++中奇怪的天花板错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15291665/

相关文章:

c++ - 为什么我的非递归 sqrt 函数是递归的?

floating-point - Unity3d 浮点精度限制

javascript - 美元金额的上限

c# - 如何将 float 舍入到最接近的 n 倍数?

c++ - float 大小的计算成本

php:将分钟舍入到最近的一刻钟,然后做更多

delphi - 为什么 Math.Ceil 在参数计算变量值时会给出意想不到的结果?

c++ - 3D几何引擎

c++ - 无序集 : invalid operands to binary expression ('const Play' and 'const Play' )

c++ - C++ 类是否具有默认构造函数以及在以下情况下调用哪些构造函数?