我一直在创建一个用于实施 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)
可以看出,如果我pow用int文字调用,结果将是数字的实际平方。但是,如果我使用 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实际转换为更高的整数值的返回值?现在这是真正的问题。
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |