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

Osiem dziesiętnych cyfr znaczących w typie float

Ostatnio zmodyfikowano 2018-01-03 07:19
Autor Wiadomość
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 (227 wynosi
134217728
, co jest większe od 108, 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).
P-168333
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
P-168334
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.
P-168335
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).
P-168336
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.
P-168337
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.
P-168338
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ążę).
C/C++
#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ą)
P-168342
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.
P-168347
« 1 » 2
  Strona 1 z 2 Następna strona