to comp.compilers item ma specjalne zalecenia do obliczeń modulo 3.
Alternatywnie, w szczególności, jeśli rozmiar dające maksimum dywidendy jest niewielki, to należy pomnożyć przez odwrotność 3 jako stałą wartość zadanej, z wystarczającą ilością bity precyzji, aby obsłużyć dywidendę o maksymalnej wielkości, aby obliczyć iloraz, a następnie odejmij 3 * iloraz od dywidendy, aby uzyskać pozostałą część. Wszystkie te mnożenia można realizować za pomocą ustalonej sekwencji zmian i uzupełnień. Liczba instrukcji będzie zależeć od wzoru bitowego odwrotności. Działa to całkiem dobrze, gdy maksymalna wartość dywidendy jest niewielka.
Jeśli chodzi o dodawanie cyfr w liczbie ... jeśli chcesz dodać cyfry dziesiętną, skończy się to robieniem tego, co równa się konwersji liczby na dziesiętne, co oznacza dzielenie przez 10 gdzieś . Jeśli chcesz wyrazić zgodę na dodanie cyfr w base2, możesz to zrobić za pomocą łatwej zmiany w prawo i dodania pętli. Do tego można użyć różnych sprytnych sztuczek w kawałkach N bitów, aby przyspieszyć to dalej.
Dodanie cyfr nie zadziała w tym przypadku, ponieważ musisz najpierw przekonwertować liczbę na liczbę dziesiętną, która zajmuje _ dużo więcej czasu niż tylko podział. –
Co właściwie chcesz osiągnąć? O ile nie jest to teoretyczna ciekawostka, wątpię, by ten konkretny problem mógł być wąskim gardłem aplikacji świata rzeczywistego ... –
jest zarówno praktyczny, jak i teoretyczny. powstaje pytanie, próbując rozprowadzić wiele zagnieżdżonych pętli przez centra kartezjańskie wśród wątków (Cuda, ale nie jest to ważne). Już rozwiązałem problem w inny sposób, ale nadal chciałbym wiedzieć, czy jest jakiś sposób. To jest prawdziwe wąskie gardło, ponieważ podział na liczby całkowite i modulo są znacznie droższe niż rzeczywiste operacje zmiennoprzecinkowe, które próbuję wykonać równolegle. – Anycorn