我尝试制作一个C程序将用户输入的十进制数转换为八进制数.我用自己的逻辑编写了C代码,没有研究其他用户如何尝试这样做.它适用于数字601和其他一些数字,但对于大多数数字,它返回八进制等效值,最后一个数字1小于它应该的数量.因为75它返回112而不是113.我体会到使用printf与%o干得不错,但它是一种挫败学习编程的目的.这是我的代码:
#include <stdio.h>
#include <math.h>
/* converting decimal to octal */
int main()
{
int n,x,y,p,s;
printf("Enter a decimal number ");
scanf("%d",&x);
s=0;p=0;
while (x!=0)
{
y=x%8;
s=s+y*pow(10,p);
x=(x-y)/8;
p=p+1;
}
printf("the octal equivalent is: %d\n",s);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一种有趣的方式.我将就原创性问题进行投票.
通过添加软糖因子来解决问题:
s = s + y*pow(10,p) + 0.1;
Run Code Online (Sandbox Code Playgroud)
问题是浮点精度.其中一个粉末计算返回99.99999999999992而不是100.转换回int失去0.999 ...分数并得到99而不是100.或999而不是1000.它不在一个位置,因为零指数是一个完全得到1.0的特殊情况.
顺便说一下,因为你只能在32位int中得到9位数,所以susmit的建议是以int形式乘以10的幂是非常合理的.除特殊情况外,pow将计算pow(x,y)为exp(y*log(x)).exp()和log()往往是昂贵的计算.
顺便说一句,即使通过强制exp和日志计算,我也无法重现这个问题.我得到(10 + 1.8e-15),(100 + 4.3e-14)和(1000 + 6.8e-13)的值,所有舍入都正确,因为错误全部为正.这是在x86上,我相信我用VC++ 2008编译了这个计算器.你用的是什么编译器?