2012-03-24 4 views
0

나는 아래의 코드를 사용하여 가능한 한 많은 정밀도 숫자를 얻기 위해 시리즈 표현을 사용하여 전자를 근사하려고 노력해 왔지만 계산 한 단어의 수와 상관없이 정밀도 숫자 동일하게 유지되는 것 같습니다. 예 :대략적인 e - 가능한 한 많은 정밀도 숫자 얻기

2.71828198432922363281250000000000000000000000000000

그것은 잘못 내 접근 방식인가? 다음은 코드입니다 :

1 #include <stdio.h> 
    2 #include <iostream> 
    3 #include <math.h> 
    4 using namespace std; 
    5 
    6 float factorial (float a) 
    7 { 
    8   if (a > 1) 
    9   { 
10     return (a * factorial (a-1)); 
11   } else 
12   { 
13     return 1; 
14   } 
15 } 
16 
17 int main() 
18 { 
19   float sum = 0; 
20   int range=100000; 
21 
22   for (int i=0; i<=range;i++) 
23   { 
24     sum += pow(-1,i)/factorial(i); 
25   } 
26   sum = pow(sum,-1); 
27   printf("%4.50f\n", sum); 
28 } 
+7

: 당신이 얻을 여기

는 결과입니다 8 번째 자리에 오류가 있습니다. 'float' 대신'long double'을 사용해보십시오. 결과가 다소 좋아 졌는지 확인하십시오. – dasblinkenlight

+2

google for "모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야하는 것". 조건이 충분히 작아지면 더 이상 합계에 영향을주지 않습니다. –

+0

@gspr : printf 앞에있는 마지막 줄을 기록하십시오. 물론'pow()'는 매우 느린 방법입니다. –

답변

2

더 정확한 숫자를 얻으려면, 당신은 더 많은 숫자, 말, 1000 개 숫자를 저장하는 데이터의 클래스를 작성해야한다. 가장 어려운 부분은 +, -, *,/작업을하는 것입니다.

수학 수식을 실험하기 만하면 파이썬과 같은 다른 언어를 선택할 수 있습니다. 더 정확한 계산을 할 수있는 Decimal, Fraction과 같은 데이터 유형이 있습니다.

나는 공식 테스트하기 위해 파이썬 스크립트를 작성 할 수 있도록 수학 사랑 : 당신은 데이터 유형의 선택에 의해 제한됩니다

After 71 iteration: 
2.71828182845904523536028747135266249775724709369995 
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166429 
+0

내가 원했던 것이 결과 (즉 가능한 한 많은 자릿수를 가진 e의 근사치)라면 답은 굉장 할 것입니다. 그러나 나는 또한 프로세스의 정확한 시간 측정과 결과를 저장하는 데 필요한 바이트 수를 필요로하므로 C++로 썼다.나는 C++이 저수준을 다루는 것이 더 좋을 것이라고 생각했다. 또한, 그것은 Computer Organization 클래스의 과제이며, 우리 교수는 너무 높은 수준이므로 Python을별로 좋아하지 않습니다. – ratsimihah

+0

그래서 숙제입니다. 그렇다면 C++ 라이브러리 사용도 허용되지 않는다고 생각합니까? 파이썬의 Decimal 클래스를 C++로 구현하면 위의 코드를 C++로 포팅 할 수 있습니다. – Ray

0

당신은 추가 수가 합보다 훨씬 작은 한계를 타격하고, 수레는 기본적으로 유리수 때문에,이 차단됩니다. 첫 번째 8 자리 숫자로 저장하는 경우

12345.123 
+ 0.0001 
------------ 
12345.123 

: 여기에 좋은 약 the subtleties of floating point numbers

예를 읽습니다.

쉽게 해결할 수있는 범위에서 0으로, 작은 숫자로 합계를 시작하고 손실 된 숫자를 추적 할 수 있습니다. 예를 들어 :

sum0 = 12345.123 
b0 =  0.0001 
sum1 = sum0 + b0 # 12345.123 
diff1 = (sum1 - sum0) - b0 # 0.0001 
# the result you want is sum1 + diff1 

# keep on iterating and summing 
+0

이것은 FP 정밀도의 한계에 대한 수정 사항이 아닙니다. 합산 방법에 관계없이 최종 결과는 많은 자릿수를 가질 수 있습니다. –

+0

@quant_dev 나머지 (diff1)를 추적 할 수 있습니다. 이것이 슬라이딩 평균 계산이 작동하는 방식입니다. – j13r

+0

사실,하지만 당신은 OP가하려고했던 단일 부동 소수점 숫자로 표현하지 않습니다. –

관련 문제