看板 C_and_CPP 關於我們 聯絡資訊
我使用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
abcabcabc:因為他轉了你要轉的,你沒叫他轉的,他不自作聰明 08/05 22:57
abcabcabc:所以只要注意到各運算子的優先順序就OK了 08/05 22:58
abcabcabc:如果硬要那麼寫的話,善用() 或每組東西前都加個轉換 08/05 22:59
MaxHaru:ans=(double)(ans + 1/((2*i)+1) * (i%2 == 0 ? 1 : -1); 08/05 23:13
MaxHaru:可是我寫成這樣才會有問題說,為什麼?? 08/05 23:13
MaxHaru:ans = (double)(ans + 1/((2*i)+1) * (i%2 == 0 ? 1:-1)); 08/05 23:14
MaxHaru: 也 08/05 23:15
DennisKao:i是int,1/((2*i)+1的結果會失真...如果有小數的話 08/05 23:36
abcabcabc:因為優先順序, 1/3 如果你是給他 int 的話 08/05 23:38
abcabcabc:所以你(double)看什麼東西需要轉的,要對好目標 08/05 23:39
DennisKao:所以,把1轉型成double後,compiler把除號後的分子轉型 08/05 23:39
abcabcabc:它 int 的仍是 int 你沒轉 加起來後的東西你才轉 08/05 23:39
aecho:1.0/3.0 和 1/3是不同的東西喔~~ 08/06 07:18