C:具有将二进制转换为十进制的幂函数

时间:2013-09-25 08:55:40

标签: c rounding pow

我正在尝试使用递归将十进制数转换为二进制数。 但我的输出错误...我试图调试程序并陷入“pow()”。 我插入了许多printf语句来查看变量的状态...... 这是我的计划......

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

void main(){
int n,k;
int z;
long b,j;
long binary(int,int);
printf("Enter a Number : ");
scanf("%d",&n);
printf("Binary Equivalent is : ");
k=log2(n);
b=binary(n,k);
z=pow(10,k); 
printf("\n\nb=%d ,z=%d",b,z); 
}



long binary(int n,int c)
{
    int a,np;
    static long b=0;
    if(n<=1){
        b=(n%2)*(int)pow(10,c)+b;
        printf("\n nmod2=%d\nb=%ld\nc=%d\nn=%d ",(n%2),b,c,n);
        return b;
    }
    else{
        a=n%2;  
        np=pow(10,c);
        b=a*np+b;
        printf("\n a=%d,np=%d \n nmod2=%d \n b=%ld \n c=%d \n n=%d ",a,np,(n%2),b,c,n);
        binary(n/2,--c);
    }
}


Output is:
Enter a Number : 5
Binary Equivalent is :
 a=1,np=99
nmod2=1
b=99    
c=2    
n=5
 a=0,np=10
nmod2=0
b=99
c=1
n=2
 nmod2=1
b=100
c=0
n=1

b=100 ,z=100

为什么二元()中的“pow(10,c)”在c = 2时等于99为什么不是100,如在main()中那样?

3 个答案:

答案 0 :(得分:3)

问题在于:

(int)pow(10,c)

结果大约是100,但是使用(int)将其四舍五入可以得到99或100,具体取决于pow的舍入误差。

这是math.h中的一个方便的功能lround,可以帮助您。它将数字舍入为最接近的整数,将0.5向零舍入。

或者,您可以定义:

int my_round(double f) {
    return (int)(f+0.5);
}

添加0.5并向下舍入看起来像四舍五入到最接近的整数。

答案 1 :(得分:1)

pow()函数是一个浮点函数,它往往搞砸了这些东西。如果没有适当的舍入来补偿,你不应该将它用于整数。

答案 2 :(得分:0)

多个问题。

  1. 正如其他人指出pow(10,c)的结果是问题所在。 pow()将为pow(10,2)返回完全 100.0。期望来自pow()的行为是合理的,但谨慎的程序员会像其他人建议的那样做,并且将浮点数舍入为int

  2. 舍入到最近是具有库函数的最佳句柄。如果想要自己动手:

    int IRound(double f) { return (f > 0.0) ? (int)(f + 0.5) : (int)(f - 0.5); }

  3. long binary(int n,int c)n > 1时未返回值。怀疑是return binary(n/2,--c)

  4. static long b=0;是处理递归的错误方式。 long binary(int n,int c)名义上只能正确运行一次。第二个电话b不一定从0开始。

  5. 鉴于pow()片状,log2()也可能需要特别小心。