latajacaryba Temat założony przez niniejszego użytkownika |
Java - Strictfp - dlaczego nie ma tego w c++ » 2017-05-06 21:42:48 Witam. Natknąłem sie na słowo "Strictfp". Wiem, że procesory intel wykonując obliczenia na double przechowują je 80-bitowym zapisie, natomiast po obliczeniach obcinają je do 64 bitów. Oczywiście wyniki są dokładniejsze, ale mogą różnić się od tych, które zostały obliczone bez zmiennych 80- bitowych. Z pomocą przychodzi właśnie Strictfp. Dzięki temu kod jest przenośny;
Pytanie: dlaczego nie ma tego w c++? |
|
Elaine |
» 2017-05-06 23:35:27 Wiem, że procesory intel wykonując obliczenia na double przechowują je 80-bitowym zapisie, natomiast po obliczeniach obcinają je do 64 bitów. |
Mamy 2017 rok, obliczenia zmiennoprzecinkowe robi się przy pomocy instrukcji SSE, które operują bezpośrednio na 32 i 64 bitach. Stare FPU jest używane praktycznie tylko wtedy, gdy ktoś potrzebuje tych 80 bitów. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-05-07 01:25:42 Ok, dzięki. Nie podejrzewałem, że informacje są nieaktualne, bo książka jest z tego roku. Jak widać autor o tym zapomniał. Czyli obliczenia cały czas są wykonywane na 64 (lub 32) bitach, to jasne, ale jak przestawić się w javie/c++ na 80 bitów (bo strictfp właśnie ma nam to ograniczać, ale co daje nam działanie antagonistyczne)? |
|
jankowalski25 |
» 2017-05-07 11:39:01 jak przestawić się w javie/c++ na 80 bitów |
1. Jeśli celem jest po prostu większa precyzja, to sobie rozszerz wykładnik i mantysę zgodnie z https://en.wikipedia.org/wiki/IEEE_floating_point#Extended_and_extendable_precision_formats. Możesz mieć równie dobrze liczby zmiennoprzecinkowe "poczwórnej" precyzji i liczyć na 128 bitach, jednak zastanawiam się, do czego potrzeba aż takiej dokładności? 2. Ewentualnie możesz użyć ewaluacji leniwej i upraszczać obliczane wyrażenia stosując wzory matematyczne, wtedy pow( pow( 2, 1 / 2 ), 2 ) będzie zawsze równe 2 , bez żadnych wyników typu 1.9999998 . 3. Jeśli jednak upierasz się przy tych 80 bitach, to oczywiście asembler sobie z tym poradzi. A jeśli chcesz to połączyć z kodem w C++, to robisz z tego bibliotekę i ją linkujesz. W Javie pewnie to będą jakieś pliki *.jar albo *.class, które podasz kompilatorowi. Dopisano:Oczywiście, zdajesz sobie sprawę z tego, że możesz trafić na procesor, który nie będzie miał takich rejestrów i wtedy te 80 bitów trzeba będzie sztucznie gdzieś wprowadzić? A bytecode Javy chyba nie ma do tego oddzielnych instrukcji. W ogóle, dlaczego szukasz przeciwieństwa strictfp? Dopisano:Z pomocą przychodzi właśnie Strictfp. Dzięki temu kod jest przenośny; |
Z tego wynikałoby, że dążysz do uzyskania nieprzenośnego kodu, w którym precyzja byłaby lepsza. Radzę jednak unikać takich sztuczek, a większą precyzję zaimplementować inaczej. Jeśli okaże się to za wolne, to wtedy masz konkretny kod, który działa i dopiero wtedy można zastanowić się nad jakimiśtam optymalizacjami (ale najpierw trzeba się upewnić, że właśnie to jest "wąskim gardłem", a nie na przykład wejście/wyjście). Dopisano:Oprócz tego, w Javie możesz użyć klasy BigDecimal, a w C++ też jest parę bibliotek matematycznych do takich obliczeń, chociażby GMP (tematy na forum). |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-05-09 00:48:03 Dziękuję, pytałem z ciekawości :P
Mam jeszcze jedno pytanie: czy moglibyście wytłumaczyć mi, jak działa Unicode (dokładnie UTF 16)? Nie rozumiem trochę zapisu oraz czym jest "współrzędna kodowa znaku" i "jednostka kodowa". Zrozumiałem, że znaki mogą być zapisywane za pomocą jednej lub dwóch jednostek kodowych, a sama jednostka kodowa to np: U+20AC (€). Tylko proszę bez odsyłania do anglojęzycznych źródeł. Na naszej rodzimej wiki nie ma nic o jednostkach kodowych i współrzędnych kodowych znaku.
PS. dziwne to. W c++ jest ASCII, nie ma żadnych problemów, chce znać numer znaku to rzutuje char na int i mam, chce znak ze stringa to pobieram str, a w javie trzeba wykonać kilka linijek, żeby uzyskać jakąś współrzędną kodową znaku albo jednostkę kodową, a i tak nie zawsze wiadomo, czy czasami nie ma tam znaku, który składa się z dwóch jednostek kodowych... dziwne. |
|
jankowalski25 |
» 2017-05-09 11:53:56 Mam jeszcze jedno pytanie |
Cóż, jeden temat = jeden problem. dziwne to. W c++ jest ASCII, nie ma żadnych problemów |
Ja używam UTF-8 w C++. Poza tym, klasyczne ASCII działa na siedmiu bitach, więc nie zawiera polskich znaków. A korzystanie ze stron kodowych (zapewne używasz cp 852?) to raczej kiepski pomysł. chce znać numer znaku to rzutuje char na int i mam |
Tylko, jeśli wszystkie znaki są jednobajtowe (a nie zawsze tak jest). |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2017-05-11 23:08:34 Cholerka, napisalem wczoraj wiadomosc, ale cos nie zapisalo wiec jeszcze raz: ASCII operuje na 7 bitach? Kiedys slyszalem, ze nie mozna sobie zapisywac w kontrektnych bitach, trzeba uzywac do tego bajtow. Jesli sie myle, to czeku bool to 1 bajt a nie 1 bit? Przeciez wystarcza mu 2 stany (1 lub 0) a wiec moznaby uzywac 1 bitu? |
|
pekfos |
» 2017-05-11 23:23:07 Kiedys slyszalem, ze nie mozna sobie zapisywac w kontrektnych bitach, trzeba uzywac do tego bajtow. Jesli sie myle, to czeku bool to 1 bajt a nie 1 bit? Przeciez wystarcza mu 2 stany (1 lub 0) a wiec moznaby uzywac 1 bitu? |
Nie można zapisywać bitów, ale można bajty, to wtedy jak są zapisywane bajty, skoro składają się z bitów..? Zmienna bool ma 1 bajt, bo to najmniejsza adresowalna jednostka pamięci. |
|
« 1 » 2 |