-
Data: 2010-09-23 09:05:51
Temat: Re: Porównywanie ułamków zwykłych
Od: Piotr Chamera <p...@p...onet.pl> szukaj wiadomości tego autora
[ pokaż wszystkie nagłówki ]W dniu 2010-09-21 18:27, Piotr Chamera pisze:
> W dniu 2010-09-21 16:22, Wojciech "Spook" Sura pisze:
>> Tak też je przechowuję. Faktycznie, sprawdzenie, czy są równe jest
>> proste; co jednak wówczas, gdy chciałbym je porównać?
>
> może tak:
> gdy a > b i c > d to porównanie sprowadza się do porównania odwrotności
> ułamków b/a i d/c...
Z ciekawości, czy nie napisałem głupot spróbowałem
zaimplementować tę procedurę. Oto co mi wyszło (CommonLisp):
(defun cmp-rational (a b c d)
"Porównanie liczb a/b i c/d przy założeniu, że
a, b, c, d dodatnie oraz b i d różne od 0.
Liczby w obliczeniach pośrednich nigdy nie
są większe od wejściowych.
Zwracane wartości:
a/b > c/d => T
a/b < c/d => NIL
a/b = c/d => EQUAL"
(multiple-value-bind (c1 r1) (truncate a b)
(multiple-value-bind (c2 r2) (truncate c d)
(cond ((> c1 c2) T)
((< c1 c2) NIL)
; już wiadomo że cz. całkowite są równe, sprawdzamy reszty
((and (zerop r1) (zerop r2)) 'EQUAL)
(T (let ((r (cmp-rational b r1 d r2)))
(if (eq r 'EQUAL)
'EQUAL
(not r))))))))
Działa to całkiem sprawnie, dla miliona losowych par liczb,
gdzie licznik i mianownik są z zakresu liczb 32-bitowych
max głębokość rekursji wyniosła 9. Często jest jednak w zakresie
1-2. Powinno to być też proste do przepisania na iteracje.
Oto kilka przykładów:
,,trudny" przypadek z postów wyżej
CL-USER> (cmp-rational 11 2147483629 17 2147483647)
0: (CMP-RATIONAL 11 2147483629 17 2147483647)
1: (CMP-RATIONAL 2147483629 11 2147483647 17)
1: CMP-RATIONAL returned T
0: CMP-RATIONAL returned NIL
NIL
równość
CL-USER> (cmp-rational 11 2048 11 2048)
0: (CMP-RATIONAL 11 2048 11 2048)
1: (CMP-RATIONAL 2048 11 2048 11)
2: (CMP-RATIONAL 11 2 11 2)
3: (CMP-RATIONAL 2 1 2 1)
3: CMP-RATIONAL returned EQUAL
2: CMP-RATIONAL returned EQUAL
1: CMP-RATIONAL returned EQUAL
0: CMP-RATIONAL returned EQUAL
EQUAL
CL-USER> (cmp-rational 1 16 1 16)
0: (CMP-RATIONAL 1 16 1 16)
1: (CMP-RATIONAL 16 1 16 1)
1: CMP-RATIONAL returned EQUAL
0: CMP-RATIONAL returned EQUAL
EQUAL
,,duże" liczby
CL-USER> (cmp-rational 1 42536847596214256328 1 1248534474348433455)
0: (CMP-RATIONAL 1 42536847596214256328 1 1248534474348433455)
1: (CMP-RATIONAL 42536847596214256328 1 1248534474348433455 1)
1: CMP-RATIONAL returned T
0: CMP-RATIONAL returned NIL
NIL
CL-USER> (cmp-rational 11 2000000000000000000000 11 2000000000000000000000)
0: (CMP-RATIONAL 11 2000000000000000000000 11 2000000000000000000000)
1: (CMP-RATIONAL 2000000000000000000000 11 2000000000000000000000 11)
2: (CMP-RATIONAL 11 9 11 9)
3: (CMP-RATIONAL 9 2 9 2)
4: (CMP-RATIONAL 2 1 2 1)
4: CMP-RATIONAL returned EQUAL
3: CMP-RATIONAL returned EQUAL
2: CMP-RATIONAL returned EQUAL
1: CMP-RATIONAL returned EQUAL
0: CMP-RATIONAL returned EQUAL
EQUAL
CL-USER> (cmp-rational 11 2000000000000000000000 11 2000000000000000000001)
0: (CMP-RATIONAL 11 2000000000000000000000 11 2000000000000000000001)
1: (CMP-RATIONAL 2000000000000000000000 11 2000000000000000000001 11)
2: (CMP-RATIONAL 11 9 11 10)
3: (CMP-RATIONAL 9 2 10 1)
3: CMP-RATIONAL returned NIL
2: CMP-RATIONAL returned T
1: CMP-RATIONAL returned NIL
0: CMP-RATIONAL returned T
T
CL-USER> (cmp-rational 11 2000000000000000000002 11 2000000000000000000001)
0: (CMP-RATIONAL 11 2000000000000000000002 11 2000000000000000000001)
1: (CMP-RATIONAL 2000000000000000000002 11 2000000000000000000001 11)
1: CMP-RATIONAL returned T
0: CMP-RATIONAL returned NIL
NIL
Następne wpisy z tego wątku
- 23.09.10 11:21 Piotr Chamera
- 23.09.10 11:21 Wojciech \"Spook\" Sura
- 23.09.10 19:30 Remek
- 23.09.10 19:32 Remek
- 23.09.10 22:49 Marcin Biegan
- 24.09.10 00:09 bartekltg
- 24.09.10 02:15 Mariusz Marszałkowski
Najnowsze wątki z tej grupy
- Xiaomi [Chiny - przyp. JMJ] produkuje w całkowitych ciemnościach i bez ludzi
- Prezydent SZAP/USONA Trump ułaskawił prezydenta Hondurasu Hernandeza skazanego na 45 lat więzienia
- Rosjanie chwalą się prototypem komputera kwantowego. "Najważniejszy projekt naukowy Rosji"
- A Szwajcarzy kombinują tak: FinalSpark grows human neurons from stem cells and connects them to electrode arrays
- Re: Najgorszy język programowania
- NOWY: 2025-09-29 Alg., Strukt. Danych i Tech. Prog. - komentarz.pdf
- Na grupie comp.os.linux.advocacy CrudeSausage twierdzi, że Micro$lop używa SI do szyfrowania formatu dok. XML
- Błąd w Sofcie Powodem Wymiany 3 Duńskich Fregat Typu Iver Huitfeldt
- Grok zaczął nadużywać wulgaryzmów i wprost obrażać niektóre znane osoby
- Can you activate BMW 48V 10Ah Li-Ion battery, connecting to CAN-USB laptop interface ?
- We Wrocławiu ruszyła Odra 5, pierwszy w Polsce komputer kwantowy z nadprzewodzącymi kubitami
- Ada-Europe - AEiC 2025 early registration deadline imminent
- John Carmack twierdzi, że gdyby gry były optymalizowane, to wystarczyły by stare kompy
- Ada-Europe Int.Conf. Reliable Software Technologies, AEiC 2025
- Linuks od wer. 6.15 przestanie wspierać procesory 486 i będzie wymagać min. Pentium
Najnowsze wątki
- 2026-01-29 KSeF - 13 wątpliwości
- 2026-01-29 A ja się pochwalę
- 2026-01-29 Warszawa => Mid/Senior IT Recruiter <=
- 2026-01-29 Warszawa => Senior Java Developer <=
- 2026-01-29 Warszawa => IT Recruiter <=
- 2026-01-28 Degradacja
- 2026-01-28 Wysoki Sąd poinstruował czego unikać wyzywając Owsiaka "Równiejszego"
- 2026-01-28 Białystok => Solution Architect (Workday) - Legal Systems <=
- 2026-01-28 Białystok => Preseles Inżynier (background baz danych) <=
- 2026-01-28 Wrocław => Konsultant wdrożeniowy ERP <=
- 2026-01-28 Łódź => Microsoft Engineer <=
- 2026-01-28 Białystok => Tester manualny <=
- 2026-01-27 Tradycja ciągania posłów po sądach za wystąpienia w Sejmie będzie kontynuowana [Lepper 2]
- 2026-01-27 Pierwszy raz sprzedano więcej samochodów zeeletryfikowanych niż ice
- 2026-01-27 Elektryczny Kałasznikow




Jak kupić pierwsze mieszkanie? Eksperci podpowiadają