本文目錄一覽:
我想問一個簡單的C語言問題,就是關於浮點數的陷阱。
這是因為你累加的步長是0.1,如果你加的是1.0就可以正常退出循環。
為什麼步長是0.1就不行,因為double,float這類浮點數是二進位浮點數。
它的大於一部分的值,是精確的,因為大與一的值是整數,是2^0 2^1 2^2 這樣二的冪累加而得的。
小於一的部分,就不一定了,它們還是由二的冪累加,從2^-1 2^-2 2^-3也就是1/2, 1/4, 1/8這樣累加起來的,這樣對於有些10進位的小數,是無法精確表達的,只能近似表達。
比如0.2=1/5 這個數用2的負數次冥來表示是不行的
(二的負數次冥為1/2, 1/4, 1/8
0.2=1/5 約等於51/256 = 1/256 + 25/128 = 1/256 + 1/128 + 3/16 = 1/256 + 1/128 + 1/16 + 1/8=
0 × (1) + 0 × (1/2) + 0×(1/4) + 1 ×(1/8) + 1× (1/16) + 0 ×(1/32) + 0 ×(1/64) + 1 × (1/128) +1 × (1/256) = 0.00110011 這就是0.2的二進位小數表示。
由此可見,只要小數的值不能化為二的負冥的整數倍(這種情況很多),那麼二進位表示的小數,都只能是近似值。
既然是近似值你累加0.1想得到10.0的精確值自然不可能,判斷i != 10基本都會失敗,除非你累加的是精確的浮點數,比如1.0,或者0.125之類,整數個步長剛好可以達到你的判斷條件—-10的。
所以一般這種判斷,都是用i = 10這樣。
求C語言大神看3道有陷阱的入門編程題?
這是C語言中的「右移運算符」。一般情況下,他是按位操作。
特點:1.雙目運算符,就像+、-、*、/一樣,格式為(數1)(數2)
2.數1是被操作數,如被減數、被除數等;數2是右移位數。
3.優先順序低,結合性:從左向右運算
如:81=?表示將被移數向右移動1位
如何操作?
1.化十進位數為(注意了)對應的二進位數,對應指格式對應
2.通通右移,不足補0
3.化為十進位數
舉例:short int a=8;a=a1;
1.a=0 000 1000
2.右移一位後:a= 0 000 100
3.補0:a=0 000 0100
4.化為十進位數:a=4
舉例:int a=8;a=a1;
1.a=0 000 0000 0000 1000
2.右移一位後:a= 0 000 0000 0000 100
3.補0:a=0 000 0000 0000 0100
4.化為十進位數:a=4
一道有陷阱的C語言問題,請各位大蝦們看看
改成下面的代碼,注意計算sum的地方
#includestdio.h
int main()
{
int n,m,i;
double sum=0.0;
scanf(“%d %d”,n,m);
if(nm||n=0||n1000000||m=0||m1000000)
return 0;
for(i=0;i=m-n;i++)
{
double t = n+i;
sum+=1.0/(t*t);
}
printf(“%.5lf”,sum);
return 0;
}
原來你用的:((n+i)*(n+i))會溢出,65536*65536 = 4294967296超過int能表示的最大值
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/235815.html