2015-05-05 20 views
9

Piszę mały silnik RTS w C++ i chcę używać synchronizacji lockstep.Czy wszystkie operacje w stałych punktach C++ są deterministyczne?

Jako determinizm zmiennoprzecinkowy jest czymś, czego nawet nie mam nadziei osiągnąć, muszę użyć matematyki o stałym punkcie.

Jak deterministycznie (w porównaniu z różnymi kompilatorami i cpus) są typowe operacje na unsigned ints zdefiniowane?

Jestem szczególnie zainteresowany podziałem, ponieważ mogłoby to spowodować zaokrąglenia.

+4

100% deterministyczne, a przynajmniej powinny być, jeśli prawdopodobnie procesor nie zostanie przerwany – Raxvan

+0

@Raxvan ma rację. Właśnie tego banki używają do pieniędzy. Zazwyczaj są one skalowane o 1000, dzięki czemu mają 10 centów za zaokrąglanie rzeczy w górę/w dół. Pamiętaj, że operacje zostaną skrócone na końcu int. –

+0

Czy nie istnieją gry rts używające matematyki zmiennoprzecinkowej w tym celu? – Karl

Odpowiedz

5

Wielkość podstawowych typów całkowitych zależy od różnych platform. Możesz uniknąć tego problemu, używając uint32_t i podobnych typów.

Podpisany całkowity przepełnienie jest niezdefiniowanym zachowaniem, chociaż przepełnienie jest dobrze zdefiniowane dla typów całek bez znaku (wykonujemy arytmetyczne modulo 2^N). Mimo to musisz o to uważać, ponieważ arytmetyka modularna zazwyczaj nie jest tym, co próbujesz zrobić.

Wierzę, że standard raz na jakiś czas pozostał otwarty, dokładnie jak podział jest zaokrąglony (chociaż nie jestem pewien, czy "pozytywny/pozytywny" był kiedykolwiek otwarty). Ale myślę, że teraz jest to znormalizowane, a nawet jeśli nie, zaokrąglanie w kierunku 0 jest prawie powszechne.

Ale możesz użyć numeric_limits do sprawdzenia. Jeśli wierzyć this documentation, standard gwarantuje zaokrąglenie w kierunku zera.

+0

w C++ 03, zaokrąglanie dział było otwarte. W C++ 11, jest teraz standaryzowany, a ja mogę go skonfigurować, ale nie pamiętam tego na pewno. –