Soft Ware/C++ 언어!!

확률 계산 시 부동소수점 오버플로

달려가보자 2011. 10. 21. 22:22
확률 계산시 소수를 이용했을시

(10*9) / (2*1)   -  ①

(10/2) * (9/1)   -  ②

위의 경우가 있을시 둘다 계산 식은 같다 .

그러나 부동 소수점 오버플로 방지가 되는것은 ② 번이다.

그럼 이를 이용한 한 예를 보겠다.

 #include <iostream>

using namespace std;

long double probability(unsigned numbers, unsigned picks);

int main()
{
double total,choices;
cout<<"전체 수의 개수와 뽑을 수의 개수를 입력하십시오:\n";
while((cin>>total>>choices)&& choices<=total)
{
cout<<"당신이 이길 확률은 ";
cout<<probability(total,choices);
cout<<"번 중에서 한 번입니다.\n";
cout<<"다시 두 수를 입력하십시오.(끝내려면 q를 입력) : ";
}
cout<<"프로그램을 종료합니다.\n";
return 0;
}

long double probability(unsigned numbers, unsigned picks)
{
long double result = 1.0;
long double n;
unsigned p;

for(n=numbers, p=picks; p>0;n--,p--) result = result *n / p;

return result;
}