这是我的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n, i, num, m, k = 0;
cout << "Enter a number :\n";
cin >> num;
n = log10(num);
while (n > 0) {
i = pow(10, n);
m = num / i;
k = k + pow(m, 3);
num = num % i;
--n;
cout << m << endl;
cout << num << endl;
}
k = k + pow(num, 3);
return 0;
}
当我输入111
时,它会给我这个
1
12
1
2
我正在使用代码块。我不知道出了什么问题。
答案 0 :(得分:2)
每当我使用pow期望整数结果时,我添加.5所以我使用(int)(pow(10,m)+.5)
而不是让编译器自动将pow(10,m)
转换为int。
我已经阅读了许多地方告诉我其他人已经对我添加.5
的一些情况进行了详尽的测试,并发现零情况会有所不同。但是,准确地确定不需要它的条件可能非常困难。在不需要时使用它并没有真正的危害。
如果它有所作为,那就是你想要的差异。如果它没有什么区别,它的成本很低。
在发布的代码中,我会调整每次调用pow
,而不仅仅是我用作示例的调用。
使用log10
没有同样简单的解决方法,但可能会遇到同样的问题。由于您希望非整数答案和想要将非整数答案截断为整数,因此添加.5将是非常错误的。因此,您可能需要找到一些更复杂的工作来解决使用浮点的基本问题。我不确定,但假设32位整数,我认为在转换为1e-10
之前将log10
添加到int
的结果中,这两者都不足以将log10(10^n-1)
更改为log10(10^n)
但始终足以纠正可能反过来的错误。
答案 1 :(得分:0)
pow
执行浮点取幂。
浮点函数和操作是不精确的,你不能永远依赖它们来提供它们看似计算的精确值,除非你是专家IEEE浮点表示的精细细节以及库函数给出的保证。
(此外,浮点数甚至可能无法准确表示您想要的整数)
当您将结果转换为整数时,这尤其成问题,因为结果被截断为零:int x = 0.999999;
设置x == 0
,而不是x == 1
。即使错误方向上最小的错误也会彻底破坏结果。
你可以舍入到最接近的整数,但这也有问题;例如如果数字足够大,您的浮点数可能没有足够的精度来接近您想要的结果。或者,如果您使用浮点数执行了足够的操作(或不稳定操作),则错误可能累积到您获得错误的最接近整数的点。
如果你想做精确,整数算术,那么你应该使用这样做的函数。例如编写自己的ipow
函数来计算整数取幂,而不进行任何浮点运算。