带模数运算符和’pow’的不需要的输出
对于下面显示的代码
#include #include int main() { int a,i,n=0; int temp=0; scanf("%d",&a); //for number of digits while(temp>=0) { n++; temp = a / pow(10,n); if(temp==0) break; } printf("%d\n",n); for (i=1;i<=n;i++) { temp = a % (int)pow(10,i); printf("%d\n",temp); } return 0; }
输出是(输入是123)
123 3 3 24 123
gcc给出的输出图像
那么问题是为什么24
来了而不是23?
请检查图像,因为在线编译器(ideone)给出的输出是23.只有gcc的输出有24
我怀疑pow()
在您正在使用的平台上不是数值稳定的。 如果pow(10, 2)
返回一个小于100的double
精度,你将得到24
,例如99.9999999998765,当转换为(int)时会被截断,结果为99
,因此你得到123 % 99 == 24
。 你可以测试什么是输出
printf("%.100f\n", pow(10, 2));
如果是这种情况,并且因为看起来你真的在做整数数学运算,我会有另一个循环变量为10的倍数:
int tens; for (i = 1, tens = 10; i < n; i++, tens *= 10) { temp = a % tens; printf(tens); }
(此外,代码的初始版本存在以下问题:变量int temp;
读取未初始化(并且#include
错误地丢失)。因此代码也具有未定义的行为。
C11标准附录J2表示,在以下情况下,程序的行为是不确定的:
指定可以使用
register
存储类声明的自动存储持续时间的对象的左值在需要指定对象的值的上下文中使用,但该对象未初始化。 (6.3.2.1)。
PS while (temp >= 0)
条件是不必要的(这是导致未定义行为的原因),除了确保输入正整数的复杂方法之外; 当你在temp == 0
突然爆发,所以你可以用while (1)
代替它
我看到以下错误:
while(temp>=0)
但是temp
没有初始化。
temp = a / pow(10,n);
但是temp
是整数,计算是双倍的。 你的精度会下降,这可能是你错误输出的原因。