2012-09-23 13 views
7

Pracuję nad nową wersją mojego Mandelbrot screensaver i kończy mi się dokładność zmiennoprzecinkowa - proste wartości double nie mają wystarczających liczb znaczących dla moich potrzeb.Dowolny odpowiednik "rozszerzony" dla C#?

więcej cyfr znaczących = wyższe poziomy powiększając fraktalnej

powrotem, gdy napisali wersję ekranu Delphi 7, że zastosowano typ extended zmiennoprzecinkowych 80 bitów wielkości.

W .NET, mógłbym przełączyć się na decimal, ale uderzenie wydajnościowe jest straszne, spowalnia generowanie fraktali o współczynnik około 20.

Czy istnieje odpowiednik przedłużony dla .NET? Lub alternatywnie, czy istnieją jakieś typy liczbowe z większą precyzją niż podwójne, które nadal używają FPU do oceny i dlatego nie mają trafienia o wysokiej wydajności dziesiętnie?

Aktualizacja

Moja wygaszacz już uda się przybliżyć do fraktala przez wielu (wielu!) Rzędów wielkości; obecnie resetuje się do podstawowego fraktala tylko wtedy, gdy używany typ numeryczny nie jest w stanie oddzielić rzędnych dla sąsiednich pikseli. Dodatkowe 16 bitów precyzji od podwójnie rozszerzonego ulepszenia dałoby mi prawie 16 podwojeń wielkości.

Jeśli chodzi o wydajność, mój algorytm już jest w stanie wyeliminować 95-99% wymaganej matematyki (w porównaniu do naiwnej implementacji, która oblicza wiele pikseli), zachowując jednocześnie integralność fraktala.

+0

Prawdopodobnie musisz napisać kod natywny do tego, ponieważ rozszerzony korzysta z 80-bitowego rejestru zmiennoprzecinkowego w x86. Lub nie jestem pewien, czy możliwe jest zmniejszenie głodu programu dla większej precyzji. Nie jestem ekspertem w tej dziedzinie, więc nie mogę podać dalszych porad. – nhahtdh

Odpowiedz

4

Na platformach 64-bitowych, typ Extended jest aliasem dla Double, który jest tylko 8 bajtów. Na platformach 32-bitowych numer Extended jest reprezentowany jako 10 bajtów (80 bitów).

To oznacza, że ​​nawet Twój program Delphi może nie działać dobrze na 64-bitowych platformach.

Jeśli potrzebujesz numerycznego typu danych z więcej niż 64 bitami, wybierz opcję decimal i zoptymalizuj algorytmy, aby poprawić wydajność.

+0

Uzgodnione. Nie sądzę, że potrzebujesz większej dokładności, aby obliczyć rendery Mandlebrota o wysokiej rozdzielczości (co potwierdza fakt, że istnieje wiele programów, które osiągają niemal nieskończenie głębokie prędkości). Uważam, że PO musi po prostu myśleć inaczej o rozwiązaniu problemu. – Dai