2011-04-21 4 views
1

나는 이것을 전에 물었지만 그 질문을 이해하지 못한 사람들은 닫았다. 난 그냥 루프를 찾고 아니에요, 나는 당신이 인수와 오버 플로우에 대한 오류 처리 같은 것들을 프로덕션 코드를 위해 어떻게 할 것인지 찾고 있습니다.C++에서 계승 함수를 적절한 오류 처리로 어떻게 구현합니까?

그리고 해당 라이브러리의 코드에 연결할 수 없다면 "use library X"라고 말하지 말고 실제로 이러한 문제를 해결하십시오.

+2

귀하의 질문은 계승과 관련이 없으며 "프로그래밍이 제대로 된 것"입니까? –

+0

꽤 많은. 계승과는 아무런 관련이 없다고 말하지 않을 것입니다. 왜냐하면 간단한 문제와 같이 무거운 체중의 오류 처리를 원하지 않기 때문입니다. –

답변

3

는 같은 간단한 될 수 있습니다.

6

입력 도메인에 따라 다릅니다.

32 비트 또는 64 비트 정수를 사용하는 경우 루프를 사용하지 않아야합니다. 조회 테이블을 사용하면됩니다. n!이 64 비트 정수로 표시 될 수있는 매우 많은 수는 n입니다. 조회 테이블을 사용하면 오버플로를 쉽게 확인할 수 있습니다. 조회 테이블에 n에 대한 항목이 없으면 분명히 범위를 벗어납니다.

입력이 그보다 큰 경우 일종의 "큰 정수"클래스를 사용하게되고 오버플로가 문제가되지 않을 것입니다.

+0

"** 출력 **이 32 비트 또는 64 비트 정수인 경우?" –

+0

@Ken : 예, 사실 그것이 제가 의미했던 것입니다. 고맙습니다. –

+1

@Howard : 나는 그것이 작은 것이라는 것을 알았다. 6시 후! 내 뇌가 오버플로 예외를 던져서 거기서 멈췄다. –

9

테이블 조회를 사용하십시오. 팩토리얼은 64 비트 배정도 가변 범위를 매우 빠르게 오버플로하므로 큰 테이블이 필요하지 않습니다. 0에서 170까지의 인수 값에 대한 함수 값만 저장하면됩니다.이 범위를 벗어나는 경우 오류가 발생합니다. 수학 라이브러리뿐만 아니라 몇 가지 큰 정수 클래스를 제공하지 않는 한

unsigned factorial(unsigned n) 
{ 
    if (n > theUpperThreshold) 
     throw ExceptionFormYourMathLibrary("Explain that n! can't be represented by unsigned"); 

    return lookupTable[n];  
} 

:

+0

이것을 추가하려면 템플릿을 사용하여 목록을 생성 할 수도 있습니다. – alternative

+0

그리고 어떻게 그 오류를 생성합니까? 예외? -1을 돌려 주겠습니까? 단언? 성공하려면 매개 변수를 사용하고 0을 반환해야합니까? 여기에는 많은 옵션이 있습니다. –

+0

간단한 함수에 out-parameters를 사용하지 마십시오. -1을 반환하거나 예외를 throw합니다. – pic11

관련 문제