【问题标题】:How does the function pow work?函数 pow 是如何工作的?
【发布时间】:2014-03-29 22:22:27
【问题描述】:

编译以下程序后,我得到输出“2346”,但预期为“2345”。

#include<math.h>
#include<iostream.h>
int nr_cif(int a)
{
    int k=0;
    while(a!=0)
    {
        a = a/10;
        k++;
    }
    return k;
}

void Nr(int &a){
    int k = nr_cif(a);
    a = a % (int)pow(10,k-1);
}


int main()
{
    int a = 12345;
    Nr(a);
    cout<<a;
}

调试后,我注意到它在评估后出现错误: a = a % (int)pow(10,k-1)。为什么会在这里断掉?

【问题讨论】:

标签: c++ pow math.h


【解决方案1】:

pow 用于整数数学并不是一个好主意。我将代码更改如下:

void Nr(int &a)
{
    int ten_k = 1;
    while (ten_k < a) ten_k *= 10;
    a %= ten_k/10; // 10-to-the-(k-1)
}

您的代码中没有任何内容需要小数位数,只有位值。因此,让位置值成为您的变量。

(您也可以使用原始的 while 循环,它对负输入效果更好。但计算并返回 10 的 k 次方,而不是 k)。

pow 的问题在于它适用于浮点值,并给出非常接近但不精确的结果。该错误可能足以导致舍入值(在转换为int 之后)错误。您可以通过在强制转换之前添加 0.5 来解决这个问题……但没有意义,因为在循环中乘法比调用 pow 更快。

【讨论】:

  • 感谢您的评论,但我认为这段代码不能正常工作。例如,如果我们取 a = 12。它将通过 while 循环两次,因此 ten_k 最终将是 100。然后 'a' 不会改变它的值。我希望它删除它的第一个数字
  • @user3461699:好的,你是对的。使用a % (ten_k/10)
【解决方案2】:

我的数学并不出色或不擅长,但这似乎可行:http://ideone.com/dFsODB

#include <iostream>
#include <cmath>

float mypow(float value, int pow)
{
    float temp = value;
    for (int i = 0; i < pow - 1; ++i)
        temp *= value;

    for (int i = 0; i > pow - 1; --i)
        temp /= value;

    return temp;
}


int main() 
{
    std::cout<<pow(10, -3)<<"\n";
    std::cout<<mypow(10, -3)<<"\n";
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2021-03-30
    相关资源
    最近更新 更多