作者MaxHaru (懂得放手..才是王道)
看板C_and_CPP
標題[問題] 有關C語言型態轉換的問題
時間Wed Aug 5 22:50:35 2009
我使用Dev-C++ 4.9.9.2的環境
程式如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n,i;
double ans;
while(1){
ans = 0;
scanf("%d", &n);
for(i=0; i<=n;i++){
ans = ans + (double)1/((2*i)+1) * (i%2 == 0 ? 1 : -1);
/*如果改成下面的樣子就會有問題:
ans = (double)ans + 1/((2*i)+1) * (i%2 == 0 ? 1 : -1);
*/
}
printf("%f\n", ans*4);
}
system("PAUSE");
}
上面的公式是ans = 1 - (1/3) + (1/5) - (1/7) +...+ ((-1)^n)*(1/(2n+1))
我想問的是..
型態轉換的運算子 (float) 放在上面兩個地方..
為什麼會有不一樣的結果??
這個問題可能有點笨..
不過我想好久都想不到為什麼 >"<
型態轉換的動作究竟是怎麼運作的丫??
請版上的高手幫幫我..
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.155.138.9
1F:推 abcabcabc:因為他轉了你要轉的,你沒叫他轉的,他不自作聰明 08/05 22:57
2F:→ abcabcabc:所以只要注意到各運算子的優先順序就OK了 08/05 22:58
3F:→ abcabcabc:如果硬要那麼寫的話,善用() 或每組東西前都加個轉換 08/05 22:59
4F:→ MaxHaru:ans=(double)(ans + 1/((2*i)+1) * (i%2 == 0 ? 1 : -1); 08/05 23:13
5F:→ MaxHaru:可是我寫成這樣才會有問題說,為什麼?? 08/05 23:13
6F:→ MaxHaru:ans = (double)(ans + 1/((2*i)+1) * (i%2 == 0 ? 1:-1)); 08/05 23:14
7F:→ MaxHaru: 也 08/05 23:15
8F:推 DennisKao:i是int,1/((2*i)+1的結果會失真...如果有小數的話 08/05 23:36
9F:推 abcabcabc:因為優先順序, 1/3 如果你是給他 int 的話 08/05 23:38
10F:→ abcabcabc:所以你(double)看什麼東西需要轉的,要對好目標 08/05 23:39
11F:→ DennisKao:所以,把1轉型成double後,compiler把除號後的分子轉型 08/05 23:39
12F:→ abcabcabc:它 int 的仍是 int 你沒轉 加起來後的東西你才轉 08/05 23:39
13F:推 aecho:1.0/3.0 和 1/3是不同的東西喔~~ 08/06 07:18