Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Java - Strictfp - dlaczego nie ma tego w c++

Ostatnio zmodyfikowano 2017-05-12 17:16
Autor Wiadomość
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++?
P-160776
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.
P-160779
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)?
P-160782
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).
P-160783
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.
P-160873
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).
P-160876
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?
P-160960
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.
P-160961
« 1 » 2
  Strona 1 z 2 Następna strona