C++中pow函数计算10^i出错,致整数转二进制程序异常
整数转二进制程序的pow函数问题解决建议
问题描述
编写的C++整数转二进制程序中,执行q=q+pow(10,i)*e;语句时出现计算错误:第三次迭代i=2时,pow(10,2)实际返回99而非预期的100,导致q的结果错误。
原代码
#include<iostream> #include<cmath> using namespace std; int binary_conversion(int e,int w,int q,int n,int i) { while(abs(w)>=1){//abs(e) to ensure that for negative numbers if(abs(w)>=1){ e=w%2; w=w/2; } else { w=0; }cout<<"i is"<<i<<"\n";cout<<"q is before"<<q<<"\n"; int r=pow(10,i);cout<<" r is"<<r; q=q+pow(10,i)*e;cout<<"q is"<<q<<"\n"; i++; } return q ; } int main(){ int n,w,q=0;int i=0,e; cin>>n;w=n;e=n; binary_conversion(e,w,q,n,i); cout<<q; }
问题原因
pow()是浮点运算函数,返回值为double类型。由于浮点计算的精度特性,像10^2这样的计算可能会得到99.99999999999999这类接近100但略小的值。当你将这个double值直接赋值给int变量时,会自动截断小数部分,最终得到99。
解决方法
方法一:用整数乘法替代pow函数(推荐)
避免浮点运算的精度问题,用一个整数变量维护10的幂次,每次迭代时更新:
- 初始化
int power = 1; - 每次循环结束后执行
power *= 10;,用power代替pow(10,i)
方法二:对pow结果做四舍五入处理
如果一定要使用pow,可以用round()函数对结果进行四舍五入,修正浮点误差:
int r = round(pow(10, i));
额外修复:函数返回值未正确接收
原代码中binary_conversion采用值传递参数,主函数里的q不会被函数内的修改影响,最后输出的始终是初始的0。需要在主函数中接收函数的返回值:
q = binary_conversion(e, w, q, n, i);
修正后的示例代码
#include<iostream> #include<cmath> using namespace std; int binary_conversion(int e, int w, int q, int n, int i) { int power = 1; while(abs(w) >= 1){ e = w % 2; w = w / 2; cout << "i is" << i << "\n"; cout << "q is before" << q << "\n"; cout << " power is" << power; q = q + power * e; cout << "q is" << q << "\n"; i++; power *= 10; } return q ; } int main(){ int n, w, q = 0; int i = 0, e; cin >> n; w = n; e = n; q = binary_conversion(e, w, q, n, i); cout << q; }
内容的提问来源于stack exchange,提问作者Sarala .D
相关产品推荐
相关产品推荐

