Istnieją dwa wektory o różnych, ale powiązanych rozmiarach. Im większy jest (2 * RESOLUTION) + INDEX_OFFSET
(na przykład 2050), a mniejszy to po prostu RESOLUTION
(np. 1024). Uważam, że jest wystarczająco bezpieczny, aby założyć, że uint16_t
może być użyty do przechowywania indeksu wektorowego.Przy liczbach całkowitych C++, czy 1 dzieli się przez 2 niezawodnie równe 0 i 3/2 = 1, 5/2 = 2 itd.?
Iteracja przez większy wektor jest wykonywana poprzez zwiększenie numeru resultIndex
o 2. Podczas każdej iteracji następuje przypisanie do mniejszego wektora o indeksie (resultIndex - INDEX_OFFSET)/2
.
Zasadniczo kod opiera się na założeniu, że niezależnie od tego, czy INDEX_OFFSET
jest nieparzysta czy parzysta, powyższy podział przez 2 będzie zawsze zaokrąglany w dół, niezależnie od architektury. Na przykład, jeśli resultIndex
ma wartość 0 lub 1, oczekiwane jest 0, jeśli jest to 2 lub 3, wówczas oczekiwane jest 1 i tak dalej. Czy jest to bezpieczne założenie w ramach powyższych parametrów?
N.B. Przyjmuję do wiadomości istnienie 'Dividing integer types - Are results predictable?', ale nie wydaje się to być dokładnie zgodne.
jak zawsze '2 + 2 = 5' w bardzo dużych przypadkach 2 – Woot4Moo
@ Woot4Moo: snarky może być zabawą, ale w tym przypadku jest po prostu głupi. Podział całkowy ma bardzo szczegółowe reguły dotyczące obcinania, a faktem jest, że '3/2 == 1'. –