Ilość cyfr w części całkowitej liczby zmiennoprzecinkowej, zapisanej binarnie

Ilość cyfr w części całkowitej liczby zmiennoprzecinkowej, zapisanej binarnie
mpaw
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 531
0

Dzień dobry.

Potrzebuję wyciągnąć liczbę cyfr przed przecinkiem (część całkowita) liczby zmiennoprzecinkowej, zapisanej binarnie przy pomocy 4 składników (niestety 4-go nie do końca rozumiem, ale chyba nie jest potrzebny). Mam takie przykłady:

Kopiuj
+--
  liczba       reprezentacja         przykład
  1.0          (0, 1, 0, 1)          (-1)^0 * 1    * 2^0    = 1
  10.0         (0, 5, 1, 3)          (-1)^0 * 5    * 2^1    = 10
  10.25        (0, 41, -2, 6)        (-1)^0 * 41   * 2^(-2) = 41/4 = 10.25
  123456.0     (0, 1929, 6, 11)      (-1)^0 * 1929 * 2^6    = 1929 * 64 = 123456.0

Ostatni parametr, to chyba liczba bitów mantysy (znak, mantysa, wykładnik, nbits). Ale do rzeczy.
Czy można w jakiś sposób, bez wymnażania policzyć liczbę cyfr części całkowitej liczby zapisanej w ten sposób? Czy muszę wymnożyć?

Dzięki

PS.
Wiem, że liczbę cyfr można policzyć przy pomocy log10, ale trzeba mieć liczbę do przekazania. A jak mam tylko mantysę i wykładnik? Muszę obliczyć liczbę, czy mogę jakoś wywróżyć :D ?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Najprościej jest mając funkcję przekształcającą liczbę na tekst (co pewnie i tak będzie potrzebne) uciąć tekst na przecinku (kropce) i pobrać długość tekstu..

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
0

Ilość cyfr wyniku mnożenia liczb o M i N cyfr będzie M+N lub M+N-1 w zależności od liczb, żeby wiedzieć na pewno musisz je przemnożyć. Jeśli wystarczy Ci wynik +/- 1 to wystarczy zsumować liczbę cyfr mantysy i 2 podniesionego do potęgi wykładnika
liczbę cyfr 2^n można wg google określić jako

1+floor(n*log10(2))

a liczbę cyfr w liczbie (mantysie) jako:

ceil(log10(n+1))

czyli:

ceil(log10(mantysa+1)) + 1 + floor(wykladnik * 0.30102999566398)

powinno dać przybliżony z dokładnością do jednego wynik (pewnie nie działa dla przypadków skrajnych ale nie chce mi się testować). Sprawdziłem dla Twoich przykładów i wzór daje poprawny wynik dla 3/4 przypadków i wynik o 1 za duży dla pierwszego przypadku.

Tak czy inaczej to całkiem sporo operacji do wykonania, więc dlaczego po prostu nie przemnożyć zwyczajnie liczby, uzyskać wynik i policzyć liczbę cyfr żeby mieć 100% dokładność?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5555
0
mpaw napisał(a):

Wiem, że liczbę cyfr można policzyć przy pomocy log10, ale trzeba mieć liczbę do przekazania. A jak mam tylko mantysę i wykładnik? Muszę obliczyć liczbę, czy mogę jakoś wywróżyć :D ?

A jakbyś rozwinął log10 z szeregu taylora (niech wreszcie się matematyka na coś przyda) ? Ale tak żeby nie działał na liczbach rzeczywistych tylko na tej twojej dziwnej strukturze?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.