2010-04-08 3 views
1

안전 나누기 (및 모듈로) 기능을 정의하고 싶습니다.이 기능은 0으로 나누려고 할 때 미리 정의 된 값을 반환합니다. 예외를 던지려는 것이 아니라 "합리적인"값 (1? 0?)을 반환하고 프로그램 흐름을 계속하기를 원합니다. 분명히 올바른 반환 값은 없지만이 표준 또는 알려진 방법이 있는지 궁금합니다.안전 나누기 기능

+0

try/catch 블록의 문제점은 무엇입니까? –

+0

"int div (int a, int b, bool * bOK = 0);" 결과가 유효한지 알고 싶으면 bool 포인터를 전달하십시오. – Thomi

+6

프로그램이 나빠질수록 프로그램을 더 잘 볼 수 있습니다. 어떤 아이들도 나누지 않은 사과 조각에는 "적당한"크기가 없습니다. 이에 대한 "표준 접근 방식"은 오류를 수정하는 것입니다. – sbi

답변

2

IEEE 부동 소수점 표준은 division by zero에서 얻을 항목을 정의합니다.

  • + A/+0가 + Inf를 제공
  • 은/-0은 -Inf를 제공
  • 0/0는 정수로 작업하는 경우 NaN의

, 당신은이 표준을 사용할 수 있습니다 + 자신의 루틴을 정의 할 수 있지만, 정수 논리에서 Inf가 무엇이고 NaN이 무엇인지 정의해야합니다. 난이 있으리라 믿고있어

+0

흥미 롭습니다. 그렇다면 + Inf/-Inf/Nan을 반환하고 FPU가 던진 제로 예외를 피할 수 있습니까? – GabiMe

+0

표준에서 허용하는 옵션입니다. 그렇습니다. – MSalters

+1

@bugspy : 기본값은 FPU가 예외를 throw하지 않는 것입니다. FP에 대해 묻는다면 플랫폼은 무엇입니까? – Potatoswatter

0

출력 매개 변수로 값을 반환 할 수 있습니다. 함수 반환 형식은 bool 일 수 있으며 성공하면 true를, 0으로 나누면 false를 반환합니다. 그런 다음 기능을 수행 한 후 사실을 확인하십시오. 그러나 현대적인 접근 방식은 대신 예외를 던져 클라이언트 코드에서 잡습니다. 원하는 경우 무시할 수 있습니다.

0

는 IEEE 수레가 이미

문제를 해결로의 int에 대한 것은 당신이 예에 합격해야합니다, 그래서 값이 사용에 따라 '합리적인'가 무엇인지입니다

DivOrDefault(int a, int b, int def) 
{ 
    if (b == 0) return def; 
    return a/b; 
} 

또는 당신

+0

ieee는 어떻게 이것을 해결합니까? – GabiMe

+0

mouviciel 님의 답변을보세요. –

6

INF가/할머니 중 밴드 (당신은 또한 INF와 나 유모에 대한 부울이있는 구조체의 INT를 래핑 수) 신호 또는 아웃 오브 밴드 (out of band) (m_pGaldiator으로 제시) 할 수 당신은 특히 당신이

pair< int, bool > safe_div(int lhs, int rhs) { 
    if (rhs == 0 || lhs == INT_MIN && rhs == -1) return make_pair(0, false); 
    else return make_pair(lhs/rhs, true); 
} 

를 교대 할 수있는 C++를 요청할 것 때문에 boost::optional

optional<int> safe_div(int lhs, int rhs) { 
    if (rhs == 0 || lhs == INT_MIN && rhs == -1) return optional<int>(); 
    else return lhs/rhs; 
} 
,

정수 연산이 필요하다고 가정하고 오버플로에 대한 검사를 추가했습니다.