-
11. Data: 2010-09-21 11:40:45
Temat: Re: Porównywanie ułamków zwykłych
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Dnia 21-09-2010 o 13:37:57 Tomasz Kaczanowski
<kaczus@dowyciecia_poczta.onet.pl> napisał(a):
> Wojciech "Spook" Sura pisze:
>> Dnia 21-09-2010 o 11:56:54 Tomasz Kaczanowski
>> <kaczus@dowyciecia_poczta.onet.pl> napisał(a):
>>
>>>> dużych mianownikach, których GCD wynosi 1, na przykład 1/2147483629 i
>>>> 1/2147483647. Ich wspólnym mianownikiem jest 4611685977625198592, co
>>
>>> *Jesli sprawdzasz tylko równość*, to w zasadzie szukając największych
>>> wspólnych dzielników licznika i mianownika każdego z ułamków,
>>> powinieneś obie liczby sprowadzić do tej samej postaci....
>> Nie jestem pewien, czy zawsze jest to możliwe. Perfidny przykład -
>> wstaw odpowiedni znak pomiędzy ułamki 11/2147483629 i 17/2147483647.
>> Wszystkie NWD są równe 1, bo złośliwie dobrałem same liczby pierwsze.
>> NWW mianowników to - jak wspomniałem - 4611685977625198592, co
>> przekracza zakres long int.
>
> A one są równe?
Nie wiem, jakie są. Chcę postawić pomiędzy nimi znak.
Ściślej: potrzebuję napisać zbiór metod (bool MoreThan(a, b), bool
LessThan(a, b) etc.), które pozwolą mi ustalić relację pomiędzy dwoma
ułamkami zwykłymi.
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !
-
12. Data: 2010-09-21 11:42:34
Temat: Re: Porównywanie ułamków zwykłych
Od: " " <f...@g...pl>
>
> > Jesli sprawdzasz tylko równość, to w zasadzie szukając największych
> > wspólnych dzielników licznika i mianownika każdego z ułamków, powinieneś
> > obie liczby sprowadzić do tej samej postaci....
>
> Nie jestem pewien, czy zawsze jest to możliwe. Perfidny przykład - wstaw
> odpowiedni znak pomiędzy ułamki 11/2147483629 i 17/2147483647. Wszystkie
> NWD są równe 1, bo złośliwie dobrałem same liczby pierwsze. NWW
> mianowników to - jak wspomniałem - 4611685977625198592, co przekracza
> zakres long int.
>
Mz nalezaloby sprowadzic do wspolnej postaci.
To co ze przekracza zakres long inta. Napisanie sobie kodu ktory
umie mnozyc dlugie liczby na na piecdziesiat miejsc dziesietnych
teoretycznie nie jest trudne (choc wiadomo ze programisci (wyłaczając
tych od asma) sa leniwi i maja slabe glowy - ale to nie jest coś czego
zasadniczo nasze kompy by nie potrafily 'udzwignac' - po to są
- trzebaby to tylko napisac, sam musze to kiedyś zrobic :-/
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
13. Data: 2010-09-21 11:47:24
Temat: Re: Porównywanie ułamków zwykłych
Od: Tomasz Kaczanowski <kaczus@dowyciecia_poczta.onet.pl>
Wojciech "Spook" Sura pisze:
> Dnia 21-09-2010 o 13:37:57 Tomasz Kaczanowski
> <kaczus@dowyciecia_poczta.onet.pl> napisał(a):
>
>> Wojciech "Spook" Sura pisze:
>>> Dnia 21-09-2010 o 11:56:54 Tomasz Kaczanowski
>>> <kaczus@dowyciecia_poczta.onet.pl> napisał(a):
>>>
>>>>> dużych mianownikach, których GCD wynosi 1, na przykład 1/2147483629
>>>>> i 1/2147483647. Ich wspólnym mianownikiem jest 4611685977625198592, co
>>>
>>>> _Jesli sprawdzasz tylko równość_ , to w zasadzie szukając
>>>> największych wspólnych dzielników licznika i mianownika każdego z
>>>> ułamków, powinieneś obie liczby sprowadzić do tej samej postaci....
>>> Nie jestem pewien, czy zawsze jest to możliwe. Perfidny przykład -
>>> wstaw odpowiedni znak pomiędzy ułamki 11/2147483629 i 17/2147483647.
>>> Wszystkie NWD są równe 1, bo złośliwie dobrałem same liczby pierwsze.
>>> NWW mianowników to - jak wspomniałem - 4611685977625198592, co
>>> przekracza zakres long int.
>>
>> A one są równe?
>
> Nie wiem, jakie są. Chcę postawić pomiędzy nimi znak.
Na początku napisałeś, że chcesz sprawdzić, czy są równe, a nie
sprawdzić, który jest większy. Zaznaczyłem to również odpowiadając.
> Ściślej: potrzebuję napisać zbiór metod (bool MoreThan(a, b), bool
> LessThan(a, b) etc.), które pozwolą mi ustalić relację pomiędzy dwoma
> ułamkami zwykłymi.
Jeśli przyjdzie mi coś do głowy w tym temacie, to dam znać. Na chwilę
obecną nie mam pomysłu.
--
Kaczus
http://kaczus.republika.pl
-
14. Data: 2010-09-21 11:59:21
Temat: Re: Porównywanie ułamków zwykłych
Od: Mariusz Kruk <M...@e...eu.org>
epsilon$ while read LINE; do echo \>"$LINE"; done < "Wojciech "Spook" Sura"
>>> Witam!
>>>
>>> Zastanawiam się, w jaki sposób porównywać ułamki zwykłe?
>>>
>>> Przypuśćmy, że mam dane dwa ułamki, a/b i c/d. Chcę sprawdzić, czy są
>>> równe.
>> Rozwiązanie pewne, acz niespecjalnie wydajne - skrócić oba.
>Czytaj proszę post do końca. Podałem bardzo prosty przykład, gdzie oba
>ułamki są w najkrótszej postaci i perfidnie dobrane, bo mianowniki są
>liczbami pierwszymi.
I bez sensu je mnożyłeś. Jeśli są w najprostszej postaci, to a/b=c/d
tylko wtedy, jeśli a=c i b=d. Po to się je skraca.
--
\------------------------/
| K...@e...eu.org |
| http://epsilon.eu.org/ |
/------------------------\
-
15. Data: 2010-09-21 12:05:42
Temat: Re: Porównywanie ułamków zwykłych
Od: Mateusz Ludwin <n...@s...org>
Wojciech "Spook" Sura wrote:
> Nie jestem pewien, czy zawsze jest to możliwe. Perfidny przykład - wstaw
> odpowiedni znak pomiędzy ułamki 11/2147483629 i 17/2147483647. Wszystkie
> NWD są równe 1, bo złośliwie dobrałem same liczby pierwsze. NWW
> mianowników to - jak wspomniałem - 4611685977625198592, co przekracza
> zakres long int.
Skoro chcesz liczyć symbolicznie, to licz symbolicznie, czyli nie stosuj
wbudowanych typów stałoprzecinkowych, bo to nie ma sensu.
Być może najszybszym rozwiązaniem byłoby całkowite zrezygnowanie z liczenia NWW
i po prostu mnożenie liczników przez mianowniki (na krzyż) w oparciu o mnożenie
czysto symboliczne na tablicach znaków. Ewentualnie badaj logarytmy dziesiętne i
w przypadku kiedy widzisz, że iloczyn zmieści się w typie wbudowanym, mnóż
normalnie.
--
Mateusz Ludwin mateuszl [at] gmail [dot] com
-
16. Data: 2010-09-21 12:14:14
Temat: Re: Porównywanie ułamków zwykłych
Od: "Marcin 'Qrczak' Kowalczyk" <q...@k...org.pl>
On Sep 21, 11:45 am, "Wojciech \"Spook\" Sura"
<spook"mad@hatter"op.pl> wrote:
> Witam!
>
> Zastanawiam się, w jaki sposób porównywać ułamki zwykłe?
>
> Przypuśćmy, że mam dane dwa ułamki, a/b i c/d. Chcę sprawdzić, czy są
> równe.
Najlepiej zawsze trzymać je znormalizowane (inaczej w obliczeniach
niepotrzebnie będą się przewalały duże liczby). Wtedy a == c && b == d.
-
17. Data: 2010-09-21 13:29:59
Temat: Re: Porównywanie ułamków zwykłych
Od: Mariusz Marszałkowski <m...@g...com>
On 21 Wrz, 13:35, "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
wrote:
> Dnia 21-09-2010 o 12:20:47 Mariusz Marszałkowski <m...@g...com>
> napisał(a):
>
> > Propozycja pierwsza:
> > epsilon = dobrać_doświadczalnie;
> > return fabs( (double)a/b - (double)c/d ) < epsilon ;
>
> W taki właśnie sposób porównuję ułamki zmiennoprzecinkowe. Jednak trochę
> martwi mnie sytuacja, w której mogę otrzymać informację, że dwa ułamki są
> równe, gdy w rzeczywistości będą różniły się o mniej niż epsilon (a
> wszystkie składowe ułamków są intami, co - przynajmniej teoretycznie -
> umożliwia deterministyczne porównania).
Coś mi się wydaje że jeśli odpowiednio dobrać epsilon jako funkcję
max(|a|,|b|,|c|,|d|)
to będzie zawsze dobry wynik. ( w przypadku int i double )
Pozdrawiam
-
18. Data: 2010-09-21 14:20:08
Temat: Re: Porównywanie ułamków zwykłych
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Dnia 21-09-2010 o 13:47:24 Tomasz Kaczanowski
<kaczus@dowyciecia_poczta.onet.pl> napisał(a):
> Na początku napisałeś, że chcesz sprawdzić, czy są równe, a nie
> sprawdzić, który jest większy. Zaznaczyłem to również odpowiadając.
Ok, odnosiłem się już do mojej późniejszej odpowiedzi. Chodziło mi ogólnie
o skonstruowanie operatorów porównania. Co nie zmienia faktu, iż Twojej
metody nie da się zastosować do podanego przykładu ;)
Niemniej, dzięki za zainteresowanie tematem.
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !
-
19. Data: 2010-09-21 14:21:24
Temat: Re: Porównywanie ułamków zwykłych
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Dnia 21-09-2010 o 13:59:21 Mariusz Kruk <M...@e...eu.org>
napisał(a):
> epsilon$ while read LINE; do echo \>"$LINE"; done < "Wojciech "Spook"
> Sura"
>>>> Witam!
>>>>
>>>> Zastanawiam się, w jaki sposób porównywać ułamki zwykłe?
>>>>
>>>> Przypuśćmy, że mam dane dwa ułamki, a/b i c/d. Chcę sprawdzić, czy są
>>>> równe.
>>> Rozwiązanie pewne, acz niespecjalnie wydajne - skrócić oba.
>> Czytaj proszę post do końca. Podałem bardzo prosty przykład, gdzie oba
>> ułamki są w najkrótszej postaci i perfidnie dobrane, bo mianowniki są
>> liczbami pierwszymi.
>
> I bez sensu je mnożyłeś. Jeśli są w najprostszej postaci, to a/b=c/d
> tylko wtedy, jeśli a=c i b=d. Po to się je skraca.
Ok. A co w wypadku, gdybym chciał je porównać?
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !
-
20. Data: 2010-09-21 14:22:34
Temat: Re: Porównywanie ułamków zwykłych
Od: "Wojciech \"Spook\" Sura" <spook"mad@hatter"op.pl>
Dnia 21-09-2010 o 14:14:14 Marcin 'Qrczak' Kowalczyk <q...@k...org.pl>
napisał(a):
> On Sep 21, 11:45 am, "Wojciech \"Spook\" Sura"
> <spook"mad@hatter"op.pl> wrote:
>> Witam!
>>
>> Zastanawiam się, w jaki sposób porównywać ułamki zwykłe?
>>
>> Przypuśćmy, że mam dane dwa ułamki, a/b i c/d. Chcę sprawdzić, czy są
>> równe.
>
> Najlepiej zawsze trzymać je znormalizowane (inaczej w obliczeniach
> niepotrzebnie będą się przewalały duże liczby). Wtedy a == c && b == d.
Tak też je przechowuję. Faktycznie, sprawdzenie, czy są równe jest proste;
co jednak wówczas, gdy chciałbym je porównać?
Pozdrawiam -- Spook.
--
! ._______. Warning: Lucida Console sig! //) !
! || spk || www.spook.freshsite.pl / _ """*!
! ||_____|| spook at op.pl / ' | ""!
! | ___ | tlen: spoko_ws gg:1290136 /. __/"\ '!
! |_|[]_|_| May the SOURCE be with you! \/) \ !