2013-08-13 4 views
0

왜 내 프로그램이 작동하지 않습니까? 공식 1- (1/2) + (1/3)에서 번호를 추가하도록되어 ... + (999분의 1가) - (1/1000)는C - 숫자의 합

#include <stdio.h> 
#include <math.h> 
int main() { 
int i, j; 
float suma; 
suma = 0.f; 
for (i=0; i<1000; i++) { 
    if (i%2==0) { 
     suma=suma - 1/i; 
    } else { 
     suma=suma + 1/i; 
    } 
} 
printf("%f", suma); 

} 
+0

BTW : 그러나, 당신은 당신의 시리즈는 이중 숫자로 추가되었는지 확인하기 위해 두 배로 정확성과 캐스트 정수를 개선하기 위해 double 형식을 사용한다 (I = 1000의 역순'에 합산 제안; I> = 1; i -)'를 사용하여 정확도를 향상시킵니다. – chux

답변

5

i1/i를 인쇄 = int입니다. i1 일 때를 제외하고 항상 0을 반환합니다. 이는 1/iEuclidean division으로 평가되고 나머지는 무시되므로 발생합니다.

이렇게 계산 된 이유는 1i이 모두 정수이기 때문입니다. 분자 또는 분모가 부동 소수점 유형이어야합니다.

i을 float으로 변환하면 코드는 suma = suma - 1/(float)i이됩니다. 다른 방법은 1을 부동 소수점 유형 (suma = suma - 1.0/i 또는 suma = suma - (float)1/i)으로 만드는 것입니다.

7

0으로 나누기 !!

int main() { 
int i; 
float suma; 
suma = 0.0f; 
for (i=1; i<1000; i++) { //fix loop, start from 1 
    if (i%2==0) { 
     suma=suma - 1.0f/i; // Use 1.0, (1/i will be evaluated as int) 
    } else { 
     suma=suma + 1.0f/i; 
    } 
} 
printf("%f", suma); 

} 
0

본원 간단한 프로그램

float j = 1.0f; 
float suma = 0.0f; 
int i = 1; 

for (i=1; i <= 1000; i++) { 
    suma += j/i; 
    j = j * (-1); 
} 
+0

호기심 : 왜 "j = -j"가 아니겠습니까? 컴파일러가 어느 쪽이든 최적화 할 것이라고 가정하십시오. – chux

1

루프 0에서 시작에 대해 상기 제 1 반복 복귀 제로 오류로 나눈다. 두 번째 반복은 1/1 = 1을 반환하고 좋게 작동하지만 int를 사용하기 때문에 세 번째 반복에서 0을 반환합니다. for 루프를 1에서 시작하고 타입 변환 i를 float으로 시도해보십시오.

1

수학을 먼저 적용하면 훨씬 더 높은 정확도를 얻을 수 있습니다. 귀하의 시리즈 :

1 - 1/2 + 1/3 - 1/4 + ... + 1/999 - 1/1000 

는 다음과 같이 다시 작성할 수 있습니다 :

(1 - 1/2) + (1/3 - 1/4) + ... + (1/999 - 1/1000) 

또는 같이 이제

1/(1*2) + 1/(3*4) + ... + 1/(999*1000) 

, 당신은 계산을 수행하는 프로그램을 작성할 수 있습니다.

#include <stdio.h> 
#include <math.h> 
int main() { 
    int i; 
    double sum = 0; 
    for (i=1; i<1000; i+=2) { 
     sum += 1/(i*(i+1.)); // 1. to force cast to double 
    } 
    printf("%g", sum); 
} 
+0

이 대답은 정확도를 높이는 방법을 보여 주지만 원래 코드의 두 가지 기본 버그 (0으로 나누기를 일으키는 루프의 잘못된 시작 값과 부동 소수점이있는 정수 나누기)을 설명하거나 설명하지 않는 것이 좋습니다. 필요하다). –

+0

이 방법과 @elhadi 방법을 모두'double'으로 시도했습니다. 13 ULP 차이. 어느 쪽이든 방법을 통해 999 대 1의 역순으로 요약하여 정확도를 얻으라고 제안하십시오. – chux