garlonicon Temat założony przez niniejszego użytkownika |
Osiem dziesiętnych cyfr znaczących w typie float » 2018-01-01 21:50:46 Odnośnie postów P-168228 oraz P-168232 na pierwszej stronie tematu Zly wynik dodawania float: czy ktoś się zetknął z kompilatorem, w którym typ float miałby osiem dziesiętnych cyfr znaczących? Z tego co policzyłem, to teoretycznie jest to możliwe (2 27 wynosi 134217728 , co jest większe od 10 8, cztery bity mogą określać pozycję kropki dziesiętnej, a jeden bit wystarczy jako znak liczby - razem 32 bity). A co do typów zmiennoprzecinkowych: czy w praktyce można się natknąć na jakieś ciekawsze kodowania, które należy brać pod uwagę? Chodzi o takie dziwolągi, jak zmieniająca się podstawa potęgi (gdzieś to widziałem, ale nie mogę sobie teraz przypomnieć tamtego kodowania). |
|
mateczek |
» 2018-01-01 22:08:17 https://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa cztery bity mogą określać pozycję kropki dziesiętnej |
wykładnik może być ujemny więc z 4bitów zostały by 3bity a to już trochę lipa |
|
garlonicon Temat założony przez niniejszego użytkownika |
» 2018-01-01 22:16:33 Wiem, czytałem. Chodzi o to, że standard nie definiuje, jakie kodowanie ma być używane. Równie dobrze możesz mieć do czynienia z decimal32 zamiast binary32, a czasami może się trafić coś, co nie będzie zgodne z IEEE 754. |
|
mateczek |
» 2018-01-01 22:30:28 Chodzi o to, że standard nie definiuje, jakie kodowanie ma być używane. Równie dobrze możesz mieć do czynienia z decimal32 |
operacje zmiennoprzecinkowe powinien wykonywać fpu (sprzętowa jednostka procesora) jeśli che się mięć jaką taką wydajność to kompilator raczej wspiera formaty obsługiwane sprzętowo przez procesor(wszelkie inne formaty wymagały by albo konwersji albo emulacji). |
|
jankowalski25 |
» 2018-01-01 22:36:59 A co jeśli sprzęt nie wspiera liczb zmiennoprzecinkowych? Jeśli kompilator jest zgodny ze standardem C++, to jakoś musi sobie z tym poradzić. Chyba Elaine kiedyś o tym pisał, poszukam tamtego tematu. Znalazłem jeden z nich, okolice 15 strony tematu Programistyczne zagadki ;>: Tylko IEEE754 to nie jest coś oczywistego. Widziałem platformy, gdzie obsługi liczb zmiennoprzecinkowych nie było wcale, próby ich użycia kończyły się błędami linkera, bo emulatora liczb zmiennoprzecinkowych żadnego dostarczonego nie było, a podpinać istniejącego i tak się nie opłacało. |
|
|
garlonicon Temat założony przez niniejszego użytkownika |
» 2018-01-01 23:00:17 wykładnik może być ujemny więc z 4bitów zostały by 3bity a to już trochę lipa |
Dlaczego? Przecież mając osiem cyfr znaczących można postawić kropkę w dziewięciu miejscach (mając cztery bity jest 16 takich miejsc), a wykładnik nie musi być liczbą całkowitą zapisaną w U2 - wszystko zależy od używanego formatu. |
|
mateczek |
» 2018-01-02 06:15:41 hipotetycznych sytuacji może być cała masa. A format który jest obecnie używany jest jaki jest. Przy trzech bitach na wykładnik float nie był by wstanie zapisać liczby większej od 100 000 000. Obecna sytuacja pozwala licząc na float operować zarówno wielkimi jak i małymi liczbami(oczywiście trzeba brać pod uwagę przybliżenie jakie się z tym wiążę). #include <iostream>
using namespace std;
int main() { float liczba = 1; for( int i = 1; i < 50; i++ ) { liczba *= i; cout << liczba << " "; } }
obecna odpowiedź 1 2 6 24 120 720 5040 40320 362880 3.6288e+06 3.99168e+07 4.79002e+08 6.22702e+09 8.71783e+10 1.30767e+12 2.09228e+13 3.55687e+14 6.40237e+15 1.21645e+17 2.4329e+18 5.10909e+19 1.124e+21 2.5852e+22 6.20448e+23 1.55112e+25 4.03291e+26 1.08889e+28 3.04888e+29 8.84176e+30 2.65253e+32 8.22284e+33 2.63131e+35 8.68332e+36 2.95233e+38
przy wykładniku ograniczonym do 3 bitów obliczenia powyżej e+08 i poniżej e-08 nie były by w ogóle możliwe. System dwójkowy jest również jaki jest. Procesor póki co posługuje się zapisem binarnym. co również sprawia że liczby dokładne w systemie dziesiętnym w systemie dwójkowym mają przybliżone rozwinięcie. tak samo jak nie da się w systemie dziesiętnym zapisać dokładnie ułamka 1/3 A co jeśli sprzęt nie wspiera liczb zmiennoprzecinkowych? |
jest jeszcze arytmetyka stałoprzecinkowa (wydaje mi się prostrza w emulacji) i w większości zastosowań powinna wystarczyć. /edit W bibliotekach do obliczeń na wielkich liczbach takich jak "gmp" format zapisu wielkich liczb zmiennoprzecinkowych nie jest nijak wymuszany architekturą procka. zależy od twórców biblioteki. (na upartego mógłby to nawet być string z liczbą) |
|
Elaine |
» 2018-01-02 13:33:42 jest jeszcze arytmetyka stałoprzecinkowa (wydaje mi się prostrza w emulacji) |
Arytmetyki stałoprzecinkowej nie trzeba nawet emulować, bo to arytmetyka całkowita, tylko wynik jest inaczej interpretowany. |
|
« 1 » 2 |