HefiDL
#programowanie #programista15k #programista #matematyka

Mam zaćmienie mózgu może pomożecie, bo nawet nie wiem jak o to spytać googla. Zawiesiłem się pisząc program na wydaje mi się prostej rzeczy, a mianowicie: jako wynik mogę dostać liczbę zmiennoprzecinkową np. 0.5 jak sprawdzić (nie iterując od 0 do nieskończoności) przez, co pomnożona ta liczba da liczbę całkowitą, gdzie ten mnożnik będzie najmniejszą z możliwych liczb spełniającą tą zależność (oczywiście wiem że są takie które nie dadzą nigdy liczby całkowitej) czyli jak dla przykładowej 0.5 dostać liczbę 2 przez którą pomnożone 0.5 daje liczbę całkowitą ?
0
  • Najlepsze
  • Wszystkie komentarze
H.....s
@HefiDL: 0 jest liczbą całkowitą, więc mnóż * 0 i bedzie zawsze całkowita xd
4
Ajakamr
Ajakamr
Liczba zmiennoprzecinkowa zapisana binarnie składa sie z mantysy i wykladnika (E).

Mantysa jest z zakresu [1, 2]. Liczysz jak długie jest ułamkowe rozwinięcie binarne mantysy (dajmy na to N). Liczba przez która potrzebujesz pomnozyc to 2 ^ (max(N - E, 0)).

Złożoność stała dla dowolnej liczby zmiennoprzecinkowej.
4
vcx_
@HefiDL: mam pomysł. Weź liczbę zmienna przecinkowa, odetnij cześć całkowita. Część po przecinku skroc do najmniejszego dzielnik - dzielnik ten to będzie twój wynik.

Z twojego przykladu:
0.625 -> 625/1000 -skracamy-> 5/8

8 to
4
HefiDL
2
vcx_
@HefiDL: poczekaj, otrzymujesz liczbe zmiennoprzecinkową i potrzebujesz znaleźć dla niej dowolną liczbę całkowitą, przez pomnozenie której otrzymasz wynik całkowity?
0
HefiDL
@vcx_: Najmniejszą liczbę całkowitą
0
HefiDL
@vcx_: np dla 0.625 mam dostać 8
0
bmLq
@HefiDL: lepiej taguj #matematyka
0
H.....s
@HefiDL: a tak na poważnie nie podałeś czy to ma być pierwsza kolejna liczba calkowita, pierwsza mniejsza, czy dowolna. kolejnym rozwiązaniem zamiast *0 to *10 do skutku.
0
Onix0b
@HefiDL: *10 i podzielone przez siebie
0.5 * 10 = 5
5/5 = 1
0
HefiDL
@Onix0b: to dla 0.5 nie dostane 2 tylko 1 a dla 0.625 nie dostane 8
0
vcx_
@HefiDL: nie wiem jak bardzo Ci zależy na wydajności ale najprostsze rozwiązanie to pętla po liczbach całkowitych od 0 do jakiegoś limitu i sprawdzanie czy wyniki z mnożenia twojego 'x' z kolejną liczba całkowita dają liczbę całkowitą. A w tym celu możesz zastosować sprawdzenie warunku w stylu:
if (wynik == int(wynik))
0
Onix0b
@HefiDL: ah sorki nie wiem skad mi sie wzielo ze chcesz zeby bylo 1 hah
0
H.....s
@Onix0b: odpada. op dal dal przyklad. 0.625 x 10 / 0.625 nie daje oczekiwanego wyniku.
0
bmLq
@Hipodups: może dać wtedy * 10 * 10 * 10. Przecież pisał że do skutku
0
H.....s
@bmLq: hmm , ja pisalem by mnożyl do skutku lrzez 10 więc chyba. nie do mnie ta odpowiedź:) pojawiły sie nowe wytyczne wiec moje pomysly z mnozeniem przez 10 i 0 odpadły.
0
dratoo
dratoo
Liczba zmiennoprzecinkowa jest zapisana jako x * 2^y, gdzie x należy do (1,2). Przykładowo 0,625 = 1,25*2^(-1). Pamiętaj, że operacje na liczbach zmiennoprzecinkowych mają swoją dokładność.
0
HefiDL
Z tym co mam już sobie dam rade: WIELKIE DZIĘKI za pomoc
0