C - pow功能出乎意料的行为

时间:2016-02-14 16:46:51

标签: c

这是一个查找位数的程序。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    int i = 0, n;
    printf("Enter number: ");
    scanf("%d", &n);
    while ((n / pow(10, i)) != 0) {
        i++;
    }
    printf("%d", i);
}

此程序在任何输入上提供309作为输出(i的值)。但是,如果我将pow(10, i)的值存储在另一个变量中并将其放入while循环中,我会得到正确的输出。请帮忙!

2 个答案:

答案 0 :(得分:1)

在进行计算或评估时,C ++使用最精确的类型(当混合类型时),并且在这里有效地将double与int混合。您将用户输入数字除以非常大的指数数字。

这在理论上永远不会为零,无论除数有多大。因此,理论结果应该是无限的。但是,由于double的限制(由pow返回),它最终仍将接近零。

如果以整数存储pow的返回值,您将不再是混合类型,并且将有效地计算出数字的位数或近似的对数基数10(任何整数除以更大的整数将等于零) )。

答案 1 :(得分:0)

变化:

while( ( n / pow(10,i) )!=0 ){

要:

while( ( n / pow(10,i) ) >= 1 ){

pow返回double,因此完整结果为double,小数部分将始终为非零,直到用完指数可能值为309(转换为十进制,二进制为1024)。