왜 값이 틀린것인지 정말 모르겠어요.. 고수님들 도와주세여~

gyxor의 이미지

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 정도가 나와야하는건 분명합니다.

무엇이 잘못되었길래 엉뚱한 값들만 나오는지 알려주시면 감사하겠습니다.

rokmn3309의 이미지

이상한 값이 나오는건..

k*k 에서
p = (double)k*k; 는 이렇게 형변환을 해줬지만.
밑에서는 형변환없이 사용해서 값이 틀려지는것입니다.

공식에서 루트2파이의 /2는 제대로 된것 같은데
(1 / sqrt( ( 2*3.1415926)))
e의 마이너스 2분의 1의 x값-평균값이 자승을 어떻게 했는지 모르겠네요..
이쪽은 문외한이라..

urmajest의 이미지

100^2는 400입니다

100*100이나 pow(100,2)로 하셔야겠네요

urmajest의 이미지

standard dev 를 1로 하셨다고 했는데

exponential 안에서는 100으로 하실려고 한 것 같네요

공식을 검증하시려면 간단한 형태의 공식에 수를 대입해보고

계산기 두들겨서 맞는지 확인하면서 하세요

kslee80의 이미지

C/C++ 에서의 실수값은 정확한 값을 표현하지 못합니다..

일례로..

double i;

for(i = 0.0 ; i <= 2.0; i+= 0.1) {
    if( i == 1.1) 
        break;
}

이 코드상에서 i 값이 1.1 일때 루프는 중단되질 않습니다 -_-;;
실수 타입에 대한 표준 자체의 문제입니다 -.-;;;

따라서, 정확히 0.49999 가 나오기 힘들듯 싶네요..

xfmulder의 이미지

printf(" 100 ^ 2 = %d \n", 100 ^ 2 ); 실행결과 >>>> 100 ^ 2 = 102

내 자식들도 나처럼 !!

codebank의 이미지

주제에서 조금 벗어난 이야기지만 윗코드에 잘못 이해하고 있는 것이 있어서...
C언어에서는 승수를 나타내는 기호 연산자가 없습니다.
보통 다른 언어에서 사용되는 '^'는 C 언어에서는 XOR로 사용하고 있습니다.
왕왕 이것때문에 많은 혼란을 겪는 경우를 봤는데 이런점은 주의를 하는게 좋을
듯싶어서 덧글을 달아봅니다.

아~ 그리고 답글을 올려주신분중에 벌써 나온 이야기지만 C/C++로는 기본적인
수학은 가능하지만 전문성이 깊은 수학이나 과학적인 결과값은 기대하지 않는것
이 좋을듯합니다.
대신에 Fortran이라는 언어를 사용하실것을 권해드립니다.
찾아보니 GNU에서도 배포를하고 Intel사에서도 MS-Visual Tools에 포함가능한
Fortran 컴파일러를 판매하고 있더군요.

------------------------------
좋은 하루 되세요.

eminency의 이미지

아시는 분은 다들 아시겠지만...
꼭 C로 작업하실거라면 GSL(GNU Scientific Library)을 써보심이...

전 직접 써본건 아니고 예제 몇 개 돌려본 수준이긴 하지만 공학에 약한(?) C의 단점을 보완해줄만한 라이브러리라고 생각합니다.
다음의 GNU사이트에서 매뉴얼을 참고해 보시길...

http://www.gnu.org/software/gsl/

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

prajna의 이미지

계산식에 문제가 있습니다.

지금 계산하시고 있는 방법은 작은 사각형들의 면적의 합을 이용하여 계산을
하고 계신데, 밑변의 길이가 곱해지지 않았군요...

지금 식을 보면 P(0<X<3.59) 까지의 확률을 계산하고 계신데..
loop를 다음과 같이 바꾸면, 쉽계 계산이 될것같네요..

double x;
for (k=0; k<359; k++) {
  x = k/100.; // 반드시 100. 으로  "." 을 찍어주세요~~~
  e = -0.5*x*x;
  d += exp(e)/sqrt(2*3.141592)*0.01; // 0.01 은 밑변의 길이입니다.
}

이렇게 계산하면 대충 0.4978.... 로 나오는 군요...

위의 식은 0부터 3.59까지를 100 등분하여 작은 사각형들을 합하는
것이므로 , 오차가 많이 있습니다. 좀 더 정확한 값을 얻으려면,
좀 더 세분화 하면 될 것이고,
이런 방법보다는 정규분포의 누적확률을 계한하는 함수를 직접 이용하심이
어떨런지......

그리고, 저도 C 를 이용하여 수학 계산을 많이 하는 데 정확도에 문제가
있었던 적은 없네요~~~

보이는 것이 항상 진실일까요????

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.