pow() 在特定条件下返回错误结果(以及意外修复) - 为什么会这样?

MrL*_*mie 6 c++ gcc pow

我一直在创建一个用于实施 Eratosthenes 筛分的简短程序。在他的程序中,我使用 int startingPointwhich 保存了当前素数的值,它的乘法被标记为非素数,从它的平方开始。我使用 pow() 函数计算当前循环中起点的平方。这样做的时候,我遇到了一个奇怪的现象。当startingPoint等于 时5,则后int i = pow(startingPoint,2)的值为i24,而不是 25。这种现象仅在startingPoint等于 5时发生。之后,我运行了一些测试,导致以下代码片段:

#include <iostream>
#include <math.h>

int main()
{
    int p=5;

    int num1 = pow(5,2);
    int num2 = pow(p,2);
    float num3 = pow(p,2);
    int num4 = floor(pow(p,2));

    std::cout.precision(10);

    std::cout<<num1<<std::endl; //25
    std::cout<<num2<<std::endl; //24
    std::cout<<std::fixed<<num3<<std::endl; //25.0000000000
    std::cout<<num4<<std::endl; //25            
}
Run Code Online (Sandbox Code Playgroud)

可以看出,如果我powint文字调用,结果将是数字的实际平方。但是,如果我使用 using 调用它int p=5,那么pow返回的结果实际上比预期的结果低一个。如果我将结果传递给一个float变量,它也会收到正确的结果。

现在,我知道pow计算幂的方法是通过近似计算,因此,在转换为整数时可能会出现诸如此类的错误。我可能就让它这样吧。但真正让我停下来思考的是num4. pow(p,2)转换为 int 返回 24。但floor(pow(p,2))转换为int返回 25。因此floor函数,按照标准向下舍入一个数字,以某种方式使返回值转换为更高的整数值。

简而言之,我的问题是:这是怎么发生的?(我通过 MinGW 使用 gcc 5.3.0)

编辑:正如我在问题中已经说过的,我可以接受将pow返回值转换为较低整数值背后的原因,但我真的无法理解(而且我也没有在其他任何地方看到这种情况)是如何floor解决这个问题。如何floor使pow实际转换为更高的整数值的返回值?现在这是真正的问题。