[問題] 有關C語言型態轉換的問題

看板C_and_CPP作者 (懂得放手..才是王道)時間15年前 (2009/08/05 22:50), 編輯推噓4(409)
留言13則, 4人參與, 最新討論串1/1
我使用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

08/05 22:57, , 1F
因為他轉了你要轉的,你沒叫他轉的,他不自作聰明
08/05 22:57, 1F

08/05 22:58, , 2F
所以只要注意到各運算子的優先順序就OK了
08/05 22:58, 2F

08/05 22:59, , 3F
如果硬要那麼寫的話,善用() 或每組東西前都加個轉換
08/05 22:59, 3F

08/05 23:13, , 4F
ans=(double)(ans + 1/((2*i)+1) * (i%2 == 0 ? 1 : -1);
08/05 23:13, 4F

08/05 23:13, , 5F
可是我寫成這樣才會有問題說,為什麼??
08/05 23:13, 5F

08/05 23:14, , 6F
ans = (double)(ans + 1/((2*i)+1) * (i%2 == 0 ? 1:-1));
08/05 23:14, 6F

08/05 23:15, , 7F
08/05 23:15, 7F

08/05 23:36, , 8F
i是int,1/((2*i)+1的結果會失真...如果有小數的話
08/05 23:36, 8F

08/05 23:38, , 9F
因為優先順序, 1/3 如果你是給他 int 的話
08/05 23:38, 9F

08/05 23:39, , 10F
所以你(double)看什麼東西需要轉的,要對好目標
08/05 23:39, 10F

08/05 23:39, , 11F
所以,把1轉型成double後,compiler把除號後的分子轉型
08/05 23:39, 11F

08/05 23:39, , 12F
它 int 的仍是 int 你沒轉 加起來後的東西你才轉
08/05 23:39, 12F

08/06 07:18, , 13F
1.0/3.0 和 1/3是不同的東西喔~~
08/06 07:18, 13F
文章代碼(AID): #1AUPmyA0 (C_and_CPP)