왜 값이 틀린것인지 정말 모르겠어요.. 고수님들 도와주세여~
글쓴이: gyxor / 작성시간: 토, 2003/05/10 - 11:21오전
http://my.netian.com/~saskim95/image/07no01/no01.gif
정규분포 공식입니다.
이공식에 맞춰서 값을 계산해 봤는데요
시그마(표주편차는 1로 놓고 계산했습니다.)
0에서 3.59 까지 z 값의 합을 구해보면 이론상으론 0.49999 정도 가 나와야
하는데요.. 더 큰값이 나옵니다.
더군다나..
#include<iostream> #include<cmath> using namespace std; int main() { double d=0; int k=0; for(;k<359;k++) { // p = (double)k*k; // e = -p/20000; d += ( exp ( -(k*k / (2*(100^2)) ) ) * (1 / sqrt( ( 2*3.1415926) ) )); } cout << d; }
이부분을
d += ( exp ( -(k*k / (20000) ) ) * (1 / sqrt( ( 2*3.1415926) ) ));
이렇게 바꿔서 계산하는것과
또
d += ( exp ( e ) ) * (1 / sqrt( ( 2*3.1415926) ) ));
이렇게 계산하는 값이 다 다릅니다
exp 함수의 구조때문인지.는 잘몰라도
아무튼 값이 0.49999 정도가 나와야하는건 분명합니다.
무엇이 잘못되었길래 엉뚱한 값들만 나오는지 알려주시면 감사하겠습니다.
Forums:
뭔지는 모르겟지만 ...
이상한 값이 나오는건..
k*k 에서
p = (double)k*k; 는 이렇게 형변환을 해줬지만.
밑에서는 형변환없이 사용해서 값이 틀려지는것입니다.
공식에서 루트2파이의 /2는 제대로 된것 같은데
(1 / sqrt( ( 2*3.1415926)))
e의 마이너스 2분의 1의 x값-평균값이 자승을 어떻게 했는지 모르겠네요..
이쪽은 문외한이라..
음
100^2는 400입니다
100*100이나 pow(100,2)로 하셔야겠네요
그리구
standard dev 를 1로 하셨다고 했는데
exponential 안에서는 100으로 하실려고 한 것 같네요
공식을 검증하시려면 간단한 형태의 공식에 수를 대입해보고
계산기 두들겨서 맞는지 확인하면서 하세요
참고...
C/C++ 에서의 실수값은 정확한 값을 표현하지 못합니다..
일례로..
이 코드상에서 i 값이 1.1 일때 루프는 중단되질 않습니다 -_-;;
실수 타입에 대한 표준 자체의 문제입니다 -.-;;;
따라서, 정확히 0.49999 가 나오기 힘들듯 싶네요..
[code:1] printf(" 100 ^ 2 =
printf(" 100 ^ 2 = %d \n", 100 ^ 2 );
실행결과 >>>> 100 ^ 2 = 102내 자식들도 나처럼 !!
주제를 벗어나지만...
주제에서 조금 벗어난 이야기지만 윗코드에 잘못 이해하고 있는 것이 있어서...
C언어에서는 승수를 나타내는 기호 연산자가 없습니다.
보통 다른 언어에서 사용되는 '^'는 C 언어에서는 XOR로 사용하고 있습니다.
왕왕 이것때문에 많은 혼란을 겪는 경우를 봤는데 이런점은 주의를 하는게 좋을
듯싶어서 덧글을 달아봅니다.
아~ 그리고 답글을 올려주신분중에 벌써 나온 이야기지만 C/C++로는 기본적인
수학은 가능하지만 전문성이 깊은 수학이나 과학적인 결과값은 기대하지 않는것
이 좋을듯합니다.
대신에 Fortran이라는 언어를 사용하실것을 권해드립니다.
찾아보니 GNU에서도 배포를하고 Intel사에서도 MS-Visual Tools에 포함가능한
Fortran 컴파일러를 판매하고 있더군요.
------------------------------
좋은 하루 되세요.
아시는 분은 다들 아시겠지만... 꼭 C로 작업하실거라면 GSL(G
아시는 분은 다들 아시겠지만...
꼭 C로 작업하실거라면 GSL(GNU Scientific Library)을 써보심이...
전 직접 써본건 아니고 예제 몇 개 돌려본 수준이긴 하지만 공학에 약한(?) C의 단점을 보완해줄만한 라이브러리라고 생각합니다.
다음의 GNU사이트에서 매뉴얼을 참고해 보시길...
http://www.gnu.org/software/gsl/
노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5
계산식에 문제가 있군요..
계산식에 문제가 있습니다.
지금 계산하시고 있는 방법은 작은 사각형들의 면적의 합을 이용하여 계산을
하고 계신데, 밑변의 길이가 곱해지지 않았군요...
지금 식을 보면 P(0<X<3.59) 까지의 확률을 계산하고 계신데..
loop를 다음과 같이 바꾸면, 쉽계 계산이 될것같네요..
이렇게 계산하면 대충 0.4978.... 로 나오는 군요...
위의 식은 0부터 3.59까지를 100 등분하여 작은 사각형들을 합하는
것이므로 , 오차가 많이 있습니다. 좀 더 정확한 값을 얻으려면,
좀 더 세분화 하면 될 것이고,
이런 방법보다는 정규분포의 누적확률을 계한하는 함수를 직접 이용하심이
어떨런지......
그리고, 저도 C 를 이용하여 수학 계산을 많이 하는 데 정확도에 문제가
있었던 적은 없네요~~~
보이는 것이 항상 진실일까요????
댓글 달기