-
21. Data: 2013-11-14 16:39:16
Temat: Re: ułamki (alternatywnie do floata)
Od: A.L. <a...@a...com>
On Thu, 14 Nov 2013 09:03:42 +0100, Robert Winkler <n...@n...org>
wrote:
>Spróbuj używając tej notacji ułamkowej zapisać wartość liczby pi,
>liczba Eulera albo wartość stałej Plancka.
>Aby zrobić to z wystarczająco dobrą dokładnością
>będziesz musiał przyjąć mianownik bliski przepełnienia zmiennej int,
>co uniemożliwi ci jakiekolwiek dalsze operacje.
>Zapis taki będzie wiec bezużyteczny w inżynierii, gdyż wiele obliczeń
>opiera się na trygonometrii, a bez liczby pi nic z tego.
>To samo z fizyką cząstek elementarnych, gdzie liczbę Eulera
>czy też stałą Plancka znajdziesz tam prawie na każdym kroku.
>W astronomii też niewiele zrobisz używając liczba 32-bitowych.
>Wszędzie tam stosowanie klasycznych liczb zmiennoprzecinkowych,
>mimo że ma też swoje wady, jest zdecydowanie lepsze.
Czy Pan wie o czym Pan mowi?...
http://gmplib.org/
GMP is a free library for arbitrary precision arithmetic, operating on
signed integers, rational numbers, and floating-point numbers. There
is no practical limit to the precision except the ones implied by the
available memory in the machine GMP runs on. GMP has a rich set of
functions, and the functions have a regular interface
A.L.
-
22. Data: 2013-11-14 16:47:59
Temat: Re: ułamki (alternatywnie do floata)
Od: firr <p...@g...com>
tak wogole to wsrod tych czterech dzialan
add sub i mul sa binarnie dosyc 'prymitywne'
bo z tego co mi sie zdaje (jakos nigdy tego
nie 'sprawdzalem') binarne mnozenie sprowadza
sie do tylu dodawan ile jest zapalonych bitow
w jednym ze skladnikow np
101
x101
-------
=
101
+10100
---------
11001 = 25
czyli hardwarowo chyba latwo zaimplementowac
na jakiejs 'siatce' nawet jakby to byla siatka
64x64 bity - z dzieleniem chyba jako z jedynym jest conieco trudniej (choc dogladnie
to nie
wiem bo ten reczny algorytm ze szkoly niby nie jest taki zly a na gruncie binarnym'
sa moze jakies lepsze
-
23. Data: 2013-11-14 18:11:03
Temat: Re: ułamki (alternatywnie do floata)
Od: "Ghost" <g...@e...pl>
Użytkownik "Paweł Kierski" <n...@p...net> napisał w wiadomości
news:pkierski.pcp.1384423833@news.chmurka.net...
>W dniu 2013-11-14 09:59, Ghost pisze:
> [...]
>>> Niestety tak przygotowane liczby nie przydają się aż tak bardzo w
>>> zastosowaniach finansowych. Bzdurne ograniczenie do 4 liczb po
>>> przecinku bierze w łeb, gdy zaczynamy działać na więcej niż jednej
>>> walucie, a gdy dojdą do tego procenty, są wręcz szkodliwe... Dlatego
>>> nie wiem do czego można stosować przykładowo TCurrency z Delphi nie
>>> przydaje się do niczego sensownego, ponad proste działania....
>>
>> Do przechowywania nadaje sie idealnie, co do obliczen, wystarczy
>> minimalnie wieksza precyzja celem wlasciwej realizacji zaokraglen.
>
> Jaka precyzja jest potrzebna to już z reguły wynika z konkretnych
> uregulowań prawnych.
No i gdzies masz wiecej niz cztery cyfry po przecinku?
-
24. Data: 2013-11-14 19:37:25
Temat: Re: ułamki (alternatywnie do floata)
Od: bartekltg <b...@g...com>
W dniu 2013-11-14 10:22, Robert Winkler pisze:
> Nie wiem czy dziś w czasach wszechobecnych kalkulatorów,
> w szkole podstawowej nadal tego uczą,
> ale za moich czasów aby dodać dwa ułamki należało sprowadzić
> oba do wspólnego mianownika.
Zgadza się.
> Oznaczało to rozłożenia obu mianowników na czynniki pierwsze,
Hmmm. Ale to głupi pomysł.
> co wiązało się ze znaczną liczbą bardzo kosztownych czasowo
> operacji dzielenia przez wszystkie kolejne liczby pierwsze,
> a potem wymnożenie ich przez siebie.
> Z prostego dodawania robi się więc bardzo skomplikowana operacja.
Istnieje funkcja Najmniejsza Wspólna Wielokrotność.
NWW(a,b) = a*b/NWD(a,b)
A NWD - największa wspólna wielokrotność (gcd) liczy się
błyskawicznie (kwadratowo względem długości liczb,
jeśli to liczba dowolnej precyzji).
Można też od razu napisać
a:b + c:d = (a*d + c*b) : b*d
I dopiero wynik potraktować NWD.
Zerknąłem do wiki.
http://pl.wikipedia.org/wiki/Najmniejsza_wsp%C3%B3ln
a_wielokrotno%C5%9B%C4%87#Metoda_.28szkolna.29_poprz
ez_rozk.C5.82ad_na_czynniki_pierwsze
Rzeczywiście, opisują tu rozkład na czynniki jako "szkolną metodę",
Ja nic takiego nie pamiętam. Może skleroza.
W każdym razie, od programisty wymaga się więcej matematyki niż
od ucznia podstawówki;)
pzdr
bartekltg
-
25. Data: 2013-11-14 19:47:43
Temat: Re: ułamki (alternatywnie do floata)
Od: "Jordan Szubert" <u...@j...us.to>
Dnia 14-11-2013 o 19:37:25 bartekltg <b...@g...com> napisał(a):
> Można też od razu napisać
> a:b + c:d = (a*d + c*b) : b*d
>
> I dopiero wynik potraktować NWD.
a czasem pominięcie skracania też może mieć sens
--
Jordan Szubert
-
26. Data: 2013-11-14 19:48:10
Temat: Re: ułamki (alternatywnie do floata)
Od: bartekltg <b...@g...com>
W dniu 2013-11-14 09:40, Paweł Kierski pisze:
> W dniu 2013-11-14 09:12, Tomasz Kaczanowski pisze:
>> W dniu 2013-11-14 09:03, Robert Winkler pisze:
>>> Ale żeby nie było tak pesymistycznie.
>>> Jest jedno zastosowanie gdzie stosowanie liczba zmiennoprzecinkowych
>>> jest niedopuszczalne i gdzie od dziesięcioleci stosuje się zapis podobny
>>> do proponowanego przez ciebie, czyli liczby stałoprzecinkowe,
>>> a domeną są finanse.
>>> Z tego powody bazy danych, niektóre języki programowania i biblioteki
>>> oferują typy danych rodzaju money czy decimal do przechowywania kwot.
>>> Przyjmuje się tam jednak stała wartość mianownika,
>>> jedną z wielokrotności liczby 10,
>>> na przykład 10000, zapewnia to 4 miejsca po przecinku,
>>> co wystarczy aby prawidłowo opisać problem zaokrągleń,
>>> przy założeniu że minimalną wartością jaką można operować
>>> jest cent, grosz lub ich odpowiednik z innych systemów walutowych.
>>
>> Niestety tak przygotowane liczby nie przydają się aż tak bardzo w
>> zastosowaniach finansowych. Bzdurne ograniczenie do 4 liczb po przecinku
>> bierze w łeb, gdy zaczynamy działać na więcej niż jednej walucie, a gdy
>> dojdą do tego procenty, są wręcz szkodliwe... Dlatego nie wiem do czego
>> można stosować przykładowo TCurrency z Delphi nie przydaje się do
>> niczego sensownego, ponad proste działania....
>
> Rozwiązaniem jest float o podstawie 10 a nie 2 + dobra obsługa
> zaokrągleń.
Float to 7 cyfr dziesiętnych.
Roczne zarobki posła i już jesteś na granicy zgubienia grosika.
Z budżetu Polski podprowadziłeś 34złote ;-)
> Sam używam opakowanego http://speleotrove.com/decimal/ - ma to m.in.
> taki ficzer, że 1.23 + 1.27 = 2.50 a nie 2.5
Ciekawe. Ale czemu nie użyć liczby całkowitej?
Przewalutowania i procenty i tak liczy się do złotówki/dolara czy
grosza/centa, bo liczy się wg przepisów.
pzdr
bartekltg
-
27. Data: 2013-11-14 19:59:33
Temat: Re: ułamki (alternatywnie do floata)
Od: bartekltg <b...@g...com>
W dniu 2013-11-14 16:39, A.L. pisze:
> On Thu, 14 Nov 2013 09:03:42 +0100, Robert Winkler <n...@n...org>
> wrote:
>
>> Spróbuj używając tej notacji ułamkowej zapisać wartość liczby pi,
>> liczba Eulera albo wartość stałej Plancka.
>> Aby zrobić to z wystarczająco dobrą dokładnością
>> będziesz musiał przyjąć mianownik bliski przepełnienia zmiennej int,
>> co uniemożliwi ci jakiekolwiek dalsze operacje.
>> Zapis taki będzie wiec bezużyteczny w inżynierii, gdyż wiele obliczeń
>> opiera się na trygonometrii, a bez liczby pi nic z tego.
>> To samo z fizyką cząstek elementarnych, gdzie liczbę Eulera
>> czy też stałą Plancka znajdziesz tam prawie na każdym kroku.
>> W astronomii też niewiele zrobisz używając liczba 32-bitowych.
>> Wszędzie tam stosowanie klasycznych liczb zmiennoprzecinkowych,
>> mimo że ma też swoje wady, jest zdecydowanie lepsze.
>
> Czy Pan wie o czym Pan mowi?...
>
> http://gmplib.org/
>
> GMP is a free library for arbitrary precision arithmetic, operating on
> signed integers, rational numbers, and floating-point numbers. There
> is no practical limit to the precision except the ones implied by the
> available memory in the machine GMP runs on. GMP has a rich set of
> functions, and the functions have a regular interface
Zależy od zastosowania i tego, jak sobie radzi z małymi precyzjami.
Dawno temu nie miał spacjalizowanych typów do obsługi ciut
większych floatów, a często potrzeba właśnie poczwórnej albo
ośmiokrotnej precyzji, prawdziwej, albo sztuczkami jak
double-double czy quad-double.
Znajoma liczy w okolicach fizyki atomowej, wyniki mają
użyteczną (zgodną z eksperymentem:) precyzję w okolicach
15 cyfr, używają najczęściej fortranowskiej 4 poczwórnej
precyzji (czasem więcej), która tam jest implementowana
właśnie jako double-double.
GMP jest oczywiście jednym z najlepszych (ci pozostali
to jego forki:) ale to też spory kombajn.
Do zabaw polecam małą biblioteczkę
http://www.ttmath.org/
Oczywiście wolniejsza. Ma typy całkowite i zmienny przecinek.
Niestety, integery nie rosną w miarę potrzeb, trzeba przewidzieć
zapotrzebowanie.
pzdr
bartekltg
-
28. Data: 2013-11-14 20:25:30
Temat: Re: ułamki (alternatywnie do floata)
Od: bartekltg <b...@g...com>
W dniu 2013-11-13 19:29, firr pisze:
Nie chciałem sam karmić, ale wątek się rozbijał;)
> juz pare razy sie zastanawialem cze gdyby
> zdefiniowac sobie liczbe jako pare integerow
> licznik i mianownik (najlepiej jako i64
> a nie i32 bo dla 32 bit chyba szybko mogloby
> dochodzic do przepelnienia) to czy takie
> rachunki nie mialyby szansy byc lepszymi
> od floata/double
Jak już powiedziano, zastąpienie doubla
ułamkiem z intów sensu nie ma.
Jest to czasem przydatne, ale w specyficznych
zastosowaniach.
Jako ciekawostka, do standardu c++ wleciało coś takiego
http://en.cppreference.com/w/cpp/numeric/ratio
Za to przydać się może w innych zastosowaniach.
> zalety sa np takie
>
> 1) jest to szybkie tj arytmetyka calkowita bez dzielenia w wiekszosci operacji
Już padło. 1145/2568 + 6848/6127
Ile operacji musisz wykonać? Co najmniej 3 mnożenia i jedno dodawanie,
a wypadałoby jeszcze ułamek skrócić.
> 2) byloby to (poki sie nie wywali z powodu
> przepelnienia0 scisłe, tj nie traci informacji
Chyba, że postanowię policzyć ułamek:)
I znów, przydatne, al tylko w specyficznych zastosowaniach.
> 3) pozwala opoznic dzielenie, floaty wykonuja
> dzielenia z kazdym znakiem / - taka liczba o wiele
> rzadziej np przy wydruku na ekran reprezentacji dziesietnej
Dzielenie dwóch intów nie jest czasem mniej kosztowne niż
operowanie na typie udającym dwa razy dłuższego inta.
Dwa razy, na licznik i mianownik;)
>
> wady - nie wiem czy to wogole by dzialalo tj
> boje sie ze szybko by sie przepelniało (ale moze
> dla i64 nie tak szybko?)
>
> ktos moglby rozwinac jakos ten temat i powiedzic
> cos na temat tej opcji?
Może jakiś przykład prawie*) z życia. Generowałem sobie kiedyś
węzły i współczynniki do kwadratur gaussa. Nic prostszego,
generujesz wielomiany legandrea, potem szukasz zer - to są węzły.
Formuła trójczłonowa dla tych wielomianóww jest wymierna.
Mają tylko wymierne współczynniki.
Po wygenerowaniu wieomianów miejsca zerowe i całki
można już liczyć z dowolną precyzją, bez konieczności
przeliczania wszystkiego ze zwiększoną dokładnością.
*) prawie, bo obecne komputery są na tyle mocne, że
na wielomian potrzebny do wszelkich rozsądnych operacji
wystarczy wziąć pakiet typu gmp i wpisać sporą dokładność,
weryfikując tylko wyniki, czy nie ma szumu:)
pzdr
bartekltg
-
29. Data: 2013-11-14 23:22:55
Temat: Re: u?amki (alternatywnie do floata)
Od: A.L. <a...@a...com>
On Thu, 14 Nov 2013 20:25:30 +0100, bartekltg <b...@g...com>
wrote:
No, jeszcze jest to
http://docs.oracle.com/javase/1.4.2/docs/api/java/ma
th/BigInteger.html
Immutable arbitrary-precision integers. All operations behave as if
BigIntegers were represented in two's-complement notation (like Java's
primitive integer types). BigInteger provides analogues to all of
Java's primitive integer operators, and all relevant methods from
java.lang.Math. Additionally, BigInteger provides operations for
modular arithmetic, GCD calculation, primality testing, prime
generation, bit manipulation, and a few other miscellaneous operations
A.L.
-
30. Data: 2013-11-15 00:03:43
Temat: Re: ułamki (alternatywnie do floata)
Od: bartekltg <b...@g...com>
W dniu 2013-11-14 20:25, bartekltg pisze:
>
>> 2) byloby to (poki sie nie wywali z powodu
>> przepelnienia0 scisłe, tj nie traci informacji
>
> Chyba, że postanowię policzyć ułamek:)
Miało być "pierwiastek", nie "ułamek".
pzdr
bartekltg