zizou666 Posted April 17, 2011 Report Share Posted April 17, 2011 Ostatnio pisząc pewien program liczący przybliżone wartości pochodnych zauważyłem w Visual Studio dziwną rzecz. Otóż liczyłem pochodne z wzorów różnicowych dla funkcji cos(x) w 3 różnych punktach i porównywałem wyniki. Miałem to zadanie zrealizować dla typów float, double i long double żeby zobaczyć różnicę. Co mnie zdziwiło to fakt, że jeśli chodzi o precyzję w Visual Studio 2010 Professional między typem doube i long double nie ma żadnej różnicy. Wyliczałem przybliżone wartości pochodnych aż do momentu, kiedy odległość h we wzorach różnicowych (mniejsza o to o co chodzi teraz) była traktowana jako różna od 0 cały czas zmniejszając wartość h. Co dziwne odpaliłem program w DEV-C++, z którego kiedyś korzystałem i tam long double jest już bardziej precyzyjny. Wie ktoś może dlaczego tak jest? Przyznam się, że troszkę się zawiodłem na Visualu, który do tej pory sprawował sie doskonale. Link to comment Share on other sites More sharing options...
Lord Hrabula Posted April 17, 2011 Report Share Posted April 17, 2011 W skrócie, różnica między tymi typami w VS nie istnieje http://msdn.microsoft.com/en-us/library/9cx8xs15.aspx Link to comment Share on other sites More sharing options...
[Ekspert] Mormegil Posted April 17, 2011 Report Share Posted April 17, 2011 Rzecz w tym, że typy podstawowe według standardu nie mają określonych rozmiarów. Także typ int dla 32 bitowych systemów ma 32 bity, a dla x64 64 bity. O ile wiem z typami zmiennoprzecinkowymi sprawa ma się identycznie, z tymże są one objęte standardem http://en.wikipedia.org/wiki/IEEE_754-2008. Także taki float to sobie może być przykładowo 128 bitowy i w zasadzie wszystko jest zgodne ze standardami. Twór zwany long double to takie nie wiadomo co. Jeżeli half to 16 bitów, float 32, a double 64, to long double powinien być 128 bitowy. Z tym jest jednak problem, bo nawet dzisiejsze procesory średnio wspierają operacje na czymś takim. Co oznacza, że wszystkie operacje muszą być robione programowo. Czyli wolno. Część kompilatorów long double robi 10 bitowy. Nie wiem jak ze wsparciem sprzętowym, ale podejrzewam, że kiepsko. 64 bitowy double ma wsparcie ze strony instrukcji SSE. Co oznacza szybko. Także z tym zawodem to się trochę wstrzymaj. Przy projektowaniu kompilatora MS ktoś uznał, że prędkość jest cenniejsza, niż wątpliwy zysk dokładności. Te dwa bity to śmieszna różnica i dla kogoś kto potrzebuje faktycznie dużej precyzji jest bez znaczenia. Link to comment Share on other sites More sharing options...
zizou666 Posted April 17, 2011 Author Report Share Posted April 17, 2011 No tak masz racje. A z tym zawodem to mi sie tak powiedziało, bo mam teraz taki przedmiot durny na studiach (Metody Obliczeniowe) gdzie tego typu rzeczy są bardzo ważne, a wszystko na niego pisałem w VS do tej pory. Ale oczywiście rozumiem, że przy pisaniu bardziej normalnych programów nie stwarza to żadnego programu. I tak wogóle dzięki za wszystkie informacje Temat do zamknięcia. Link to comment Share on other sites More sharing options...