2010-04-02 13 views
7

Cześć,zmiennoprzecinkowa precyzja w Visual C++

Próbuję użyć robust predicates dla geometrii obliczeniowej od Jonathan Richard Shewchuk.

Nie jestem programistą, więc nie jestem nawet pewien tego, co mówię, być może popełniłem jakiś podstawowy błąd.

Chodzi o to, że predykaty powinny umożliwiać precyzyjną arytmetyczność z adaptacyjną precyzją zmiennoprzecinkową. Na moim komputerze: Asus pro31/S (Core Due Centrino Processor) nie działają. Problem może polegać na tym, że mój komputer może wykorzystać pewne ulepszenia w precyzji zmiennoprzecinkowej, które są sprzeczne z tym, którego użył Shewchuk. Autorka mówi:

/* On some machines, the exact arithmetic routines might be defeated by the */ 
/* use of internal extended precision floating-point registers. Sometimes */ 
/* this problem can be fixed by defining certain values to be volatile, */ 
/* thus forcing them to be stored to memory and rounded off. This isn't */ 
/* a great solution, though, as it slows the arithmetic down.    */ 

co teraz chciałbym wiedzieć, jest to, że istnieje sposób, być może niektóre opcja kompilatora, aby wyłączyć rejestry zmiennoprzecinkowe wewnętrzny rozszerzony precyzji.

Naprawdę appriaciate twoja pomoc

Odpowiedz

0

Jeśli używasz GCC, tak odpowiedzieć tutaj może pomóc:

Jeśli używasz innego kompilatora, ty może być w stanie znaleźć wskazówki w tym przykładzie (lub może dodać komentarz do tej odpowiedzi, aby sprawdzić, czy Mike Dinsdale może się dowiedzieć:

3

Opcja kompilacji dla Visual Studio to /fp:strict, która jest wyświetlana w IDE jako Project->Properties->C/C++->Code Generation->Floating Point Model

3

Tak, będziesz musiał zmienić słowo kontrolne FPU, aby tego uniknąć. Jest dobrze wytłumaczony dla najpopularniejszych kompilatorów w tym web page. Pamiętaj, że jest to dramatycznie niezgodne z tym, czego większość bibliotek oczekuje od FPU, nie mieszaj i nie łącz. Zawsze przywracaj słowo kontrolne FPU po zakończeniu.

1

_control87(_PC_53, _MCW_PC) lub _control87(_PC_24, _MCW_PC) załatwią sprawę. Te ustawiają precyzję odpowiednio na double i single z MSVC. Możesz użyć wartości _controlfp_s(...), ponieważ pozwala to na bezpośrednie pobranie bieżącego słowa kontrolnego po ustawieniu go.

+0

chcesz pracować z kompilacją x64 – Gabriel

+0

Bądź ostrzeżony Wywołanie _control87 w kompilacjach x64 może rzucić wyjątek. Program: ... Plik: amd64 \ ieee.c Linia: 109 Wyrażenie: (maska ​​i ~ (_MCW_DN | _MCW_EM | _MCW_RC)) == 0 – Damian

1

Jak zauważyli inni, można sobie z tym poradzić, ustawiając słowo kontrolne x87, aby ograniczyć precyzję zmiennoprzecinkową. Jednak lepszym rozwiązaniem byłoby przekonanie MSVC do generowania kodu SSE/SSE2 dla operacji zmiennoprzecinkowych; Jestem zaskoczony, że nie robi tego domyślnie w tym dniu i wieku, biorąc pod uwagę zalety wydajności (i to, że uniemożliwia to wpadanie w irytujące błędy, takie jak to, co widzisz), ale nie ma żadnej rachunkowości dla MSVC dziwactwa.

Odkładając na bok MSVC, wierzę, że flaga /arch:SSE2 spowoduje, że MSVC użyje instrukcji SSE i SSE2 do arytmetyki pojedynczej i podwójnej precyzji, co powinno rozwiązać problem.

+1

Cały punkt arytmetycznej rozszerzonej precyzji x87 polega na tym, aby w pierwszej kolejności unikać uciekania się do tych niedorzecznych bibliotek dla operacji macierzowych. Kto by chciał, aby mniejsza precyzja była * domyślna *? – Gabe

+1

@gabe: '' x87' nie dostarcza wystarczająco dokładności, aby wykonać dokładną arytmetykę, co zapewniają te geometryczne prymitywy. W takich przypadkach wszystko, co robi, to algorytmy łamania, które zachowują się poprawnie w * każdej innej architekturze *. Wprowadza także różnego rodzaju trudne do przewidzenia błędy, w których na wyniki numeryczne wpływają semantycznie niepowiązane obliczenia. Istnieją wyraźne korzyści dla arytmetycznej rozszerzonej 'x87', ale nie tak wiele, że powinna ona być używana bez krytycznego rozważania alternatyw. –

+0

Wow. Czy jesteś także przeciw skondensowanym operacjom wielokrotnego dodawania? Pamiętaj, że x87 było pierwszą implementacją IEEE 754 i prawie na pewno najbardziej popularną. Biorąc pod uwagę, że procesory Intel Itanium i i960 i Motorola 68881 i 88110 mają rozszerzoną arytmetyczną precyzję, to nie jest to jedyna. – Gabe

Powiązane problemy