2011-11-08 3 views
6

개인 프로젝트로서 나는 내 애완 동물 프로젝트에 임의의 정밀 숫자 형식을 구현하려고합니다.부호없는 계산이 오버플로 될 가능성이 있다면 사전에 결정하는 방법은 무엇입니까?

이미 널리 알려지고 테스트되고 강력한 라이브러리에 대해 알고 있습니다. 나는 자기 개선 교육 프로젝트로서 해결책을 찾고 싶다.

나는 지역을 연구하고 실제로 계산을하기 전에 작업이 오버 플로우가 발생할 경우 대략 예측 몇 가지 방법이 있는지 알아 내려고 노력하고 있어요. 나는 위양성에 대해서도 그렇게 걱정하지 않는다.

나는 계산에 적합한 가장 작은 공간을 사용할 수 있기를 원합니다. 계산이 원래 경계 내에서 유지되는 경우에는 그대로 유지합니다.

예 : Multiplying two 64 bit Integers if each are large enough will cause an overflow. 결과를 일 수 있고이 64 비트를 초과하는 경우에만이를 감지하고 내 번호 유형으로 업 변환합니다. 이 실험에서 부호가 번으로 사용됩니다.

오버 플로우/언더 플로우를 감지하는 가장 제정하고 효율적인 방법은 무엇입니까? 그 숫자의 : (곱하기 예) 오버 플로우를 일으킬 것입니다, 당신은 오버 플로우에 대한 좋은 기회

+0

필자는 비슷한 프로젝트를 시도한 적이 없었으므로, 단지 질문이있었습니다. 미리 오버플로에 대해 알고 있었습니까? 작은 nmbers에 대한 최적화가 빠르지 않습니까? 정확한 해결책이 필요하거나 허위 오버플로 경보를 줄 수있는 해결책을 받아들일까요? – vmatyi

+1

귀하의 질문과 답변 중 하나에 대한 답변으로 귀하가 서명 된 피연산자를 사용하고 있지만 제목에 서명이 없다고 말하고 있습니다. 무엇 이니?부호없는 산술은 다루기가 더 쉽고 임의의 정밀도 숫자로 작업하는 것이 더 적합합니다. –

+0

베이스를 나타내는 부호없는 64 비트 길이의 배열에서와 같이 부호없는 기본 유형을 기본 구성 요소로 사용하여 부호가있는 임의의 계산을 수행합니다. –

답변

2

모두 숫자 만 최상위 비트를 타고, 결과는 경우, 하나 왼쪽 시프트.

정확하지는 않지만 엄청나게 빠르며 결과에 더 큰 데이터 유형이 필요하다는 좋은 지표입니다. Undefined behavior when exceed 64 bits

+1

왜 1 시프트가 남았습니까? –

+1

이것이 오버플로를 유발할 수있는 방법입니다. 그것이 실제로 발생한다면, 당신의 숫자 중 하나가 이미 큰 것을 의미합니다. –

2
:

에만 운영자가 (심지어 64 비트 숫자) 간단한 일을 위해, 비용이 많이 드는하는 대용량 데이터 유형에 대한 감각, 당신이 있습니다 .. CPU의 내장 연산에 의존하는이 질문을 볼 수 있다고 생각을 할 수도 있습니다

그에 대한 John Regehr의 paper이 있습니다.

0

순진한 계산을 수행하는 것이 거의 항상 쉬울뿐만 아니라 (종종 빠릅니다) 오버 플로우가 발생했는지 탐지합니다. 계산을 할 때 전에 가능성을 감지하려는 특별한 이유가 있습니까?

일단 계산이 끝나면 오버플로가 발생했는지를 감지하는 것은 일반적으로 매우 쉽습니다. 순진한 연산이 저렴하기 때문에 오버 플로우가 발생하면 계산 작업에 많은 비용이 들지 않습니다. 작업을 다시해야 할 필요가 생기더라도. (일반적으로, 그렇게 할 필요는 없습니다.)

다음은 아주 간단한 예제입니다. 부호없는 64 비트 숫자 두 개를 더하면 합계를 두 가중치와 비교하여 오버플로를 확인할 수 있습니다 (오버플로가 발생한 것보다 작은 경우). 따라서 계산 후 오버플로를 감지하는 데는 단 하나의 비교 만 필요합니다 (실제로는 매우 저렴합니다).

+0

귀하의 예제는 서명되지 않은 피연산자의 경우에만 해당되며 일반적인 경우에는 유지되지 않습니다. –

+0

서명 된 오버플로의 동작은 정의되지 않습니다. –

+0

@Keith : 물론 원시 타입을위한 것입니다. OP는 임의 정밀도 유형을 구현하는 것을 말합니다. 그는 표현을 확장하기 위해 오버 플로우를 처리 할 수 ​​있어야합니다 (오버 플로우를 예방하십시오!). –