2013-01-11 5 views
6

서로 다르지만 관련 크기가 다른 두 개의 벡터가 있습니다. 더 큰 것은 (2 * RESOLUTION) + INDEX_OFFSET (예 : 2050)이고 더 작은 것은 간단히 RESOLUTION (예 : 1024)입니다. 나는 uint16_t이 벡터 인덱스를 포함하는 데 사용될 수 있다고 가정하는 것이 안전하다고 믿습니다.C++ 정수의 경우, 1을 2로 나눈 값을 0으로, 3/2 = 1, 5/2 = 2 등과 같이 신뢰할 수 있습니다.

큰 벡터를 통한 반복은 resultIndex을 2 씩 증가시켜 수행됩니다. 각 반복 동안 색인 (resultIndex - INDEX_OFFSET)/2에서 작은 벡터가 지정됩니다.

기본적으로 코드는 INDEX_OFFSET이 홀수인지 짝수 일지에 관계없이 위의 2로 나눈 값은 아키텍처에 관계없이 항상 반올림된다는 가정에 따라 달라집니다. 예를 들어, resultIndex이 0 또는 1이면 0이 예상되고, 2 또는 3이면 1이 예상됩니다. 위의 매개 변수 내에서 안전한 가정입니까?

N.B. 내가 'Dividing integer types - Are results predictable?'의 존재를 인정하지만 정확히 일치하지 않는 것 같습니다.

+3

아주 큰 경우에 2 – Woot4Moo

+4

@ Woot4Moo : snarky는 재미있을 수 있지만이 경우에는 그냥 바보입니다. Integral division은 truncation에 관한 아주 특별한 규칙을 가지고 있으며 사실은'3/2 == 1'입니다. –

답변

15

예;

[C++11: 5.6/4]:/ 이진 연산자 몫을 산출하고, 이진 연산자 % 제에 의해 제 발현의 분할에서 나머지를 산출한다 : 이것은 언어에 의해 보장된다. / 또는 %의 두 번째 피연산자가 0이면 동작이 정의되지 않습니다. 정수 피연산자의 경우 / 연산자는 폐기 된 분수 부분이있는 대수 몫을 산출합니다. 몫인 a/b이 결과 형식에서 나타낼 수있는 경우 (a/b)*b + a%ba과 같습니다.

3/2에서

모두 32 적분 피연산자; 이 연산의 대수적 인 지수는 1.5이고 소수점 부분 .5을 버릴 경우 1이됩니다. 이것은 다른 예제와 다른 모든 예제에서도 유효합니다.

+1

우수, 감사합니다! – mosi

+1

+1 그리고 하나님 께 감사드립니다. 이것이 표준입니다. 나는 상상할 수 없다 * 밖의 f'ed 코드의 양을 밖으로. – WhozCraig

+2

Note : linux =>'signal 5 : 산술 예외 '는 대개'0'에 의한 나눗셈의 결과입니다. 왜냐하면 컴파일러는 디바이더가' 0 ', 이상한 일이 발생할 수 있습니다 (일명 "정의되지 않은 동작"). –