Trochę przekierowania do zmiennoprzecinkowe (IM) precyzją, część 1

głosy
16

Większość matematyków zgadzają się, że:

e πi + 1 = 0

Jednak większość implementacji zmiennoprzecinkowe zgodzić. Jak dobrze możemy rozstrzygnąć tego sporu?

Jestem zapalonym usłyszeć o różnych językach i wdrożeń oraz różnych metod zarabiania wynik jako bliskie zeru jak to możliwe. Bądź kreatywny!

Utwórz 04/08/2008 o 07:21
źródło użytkownik
W innych językach...                            


10 odpowiedzi

głosy
16

To nie tak, że większość implementacji zmiennoprzecinkowych nie zgadzają, to po prostu, że nie mogą dostać dokładności niezbędne do uzyskania 100% odpowiedzi. I poprawną odpowiedzią jest to, że nie mogę.

PI jest nieskończona seria cyfr, że nikt nie był w stanie do określenia przez cokolwiek innego niż symbolicznej reprezentacji, a e ^ x jest taka sama, a więc jedynym sposobem, aby dostać się do 100% dokładnością, aby przejść symboliczny.

Odpowiedział 26/12/2008 o 21:22
źródło użytkownik

głosy
8

Oto krótka lista wdrożeń i języków próbowałem. Jest klasyfikowane według bliskości do zera:

  • Schemat: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i(Schemat Chez Schemat MIT)
    • 0.0+1.22460635382238e-16i(Guile)
    • 0.0+1.22464679914735e-16i(kurczaka z numbersjajkiem)
    • 0.0+1.2246467991473532e-16i(MzScheme, SISC, gauche Gambit)
    • 0.0+1.2246467991473533e-16i(SCM)
  • Common Lisp: (1+ (exp (complex 0 pi)))
    • #C(0.0L0 -5.0165576136843360246L-20)(Clisp)
    • #C(0.0d0 1.2246063538223773d-16)(CMUCL)
    • #C(0.0d0 1.2246467991473532d-16)(SBCL)
  • Perl: use Math::Complex; Math::Complex->emake(1, pi) + 1
    • 1.22464679914735e-16i
  • Pyton: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j(CPython)
  • Rubin: require 'complex'; Complex::polar(1, Math::PI) + 1
    • Complex(0.0, 1.22464679914735e-16)(MRI)
    • Complex(0.0, 1.2246467991473532e-16)(JRuby)
  • R: complex(argument = pi) + 1
    • 0+1.224606353822377e-16i
Odpowiedział 04/08/2008 o 07:22
źródło użytkownik

głosy
5

Czy jest możliwe rozstrzygnięcie tego sporu?

Moją pierwszą myślą jest, aby spojrzeć do języka symbolicznego, jak klon . Nie sądzę, że liczy się jako punkt pływających chociaż.

W rzeczywistości, w jaki sposób można reprezentować I (lub j dla inżynierów) w tradycyjnym języku programowania?

Być może lepszym przykładem jest sin (π) = 0? (Lub Tęskniłem punkt znowu?)

Odpowiedział 04/08/2008 o 07:29
źródło użytkownik

głosy
4

Twoje pytanie wydaje się trochę dziwne dla mnie, jak wydaje się sugerować, że matematyka zmiennoprzecinkowych jest realizowany przez język. To nie jest na ogół prawdziwe, jak matematyka FP odbywa się za pomocą procesora pływający punkt w sprzęcie. Ale oprogramowanie lub sprzęt, zmiennoprzecinkowych zawsze będzie niedokładny. To właśnie, jak pływa pracy.

Jeśli potrzebujesz lepszej precyzji trzeba użyć innej reprezentacji liczb. Podobnie jak jeśli robisz całkowitą matematyki na liczbach, które nie mieszczą się w int lub długo. Niektóre języki mają dla bibliotek, które zbudowano w (wiem Java BigInteger i BigDecimal), ale trzeba jawnie użyć tych bibliotek zamiast rodzimych typów, a wydajność będzie (czasem znacznie) gorsze niż w przypadku korzystania pływaków.

Odpowiedział 25/08/2008 o 14:37
źródło użytkownik

głosy
4

@Ryan Fox

W rzeczywistości, w jaki sposób można reprezentować I (lub j dla inżynierów) w tradycyjnym języku programowania?

Native złożone typy danych są daleko od nieznanego. Fortran pędził połowie lat sześćdziesiątych, a PO wykazuje szereg innych językach, które wspierają ich w hist obserwacji.

I liczby zespolone mogą być dodawane do innych języków jako biblioteki (z operatorem przeciążenia nawet wyglądają jak rodzimych typów w kodzie).

Ale chyba podać szczególny przypadek tego problemu, „nie-porozumienie” jest po prostu wyrazem niedokładnego maszynowego arytmetyki, nie? To tak jakby narzekać, że

float r = 2/3;
float s = 3*r;
float t = s - 2;

kończy się (t! = 0) (Przynajmniej jeśli używasz tyle głupi kompilatora) ...

Odpowiedział 25/08/2008 o 14:29
źródło użytkownik

głosy
4

Zgadzam się z Ryanem, trzeba by przenieść się do innego systemu reprezentacji numer. Rozwiązaniem jest poza sferę matematyki zmiennoprzecinkowej bo trzeba PI reprezentowana jako nieskończenie długiego przecinku więc każdy ograniczony schemat precyzja prostu nie będzie działać (przynajmniej nie bez zatrudniania jakieś banialuki-factor nadrobić utracony precyzja).

Odpowiedział 25/08/2008 o 02:10
źródło użytkownik

głosy
2

Miałem looooong czaty kawy z moim najlepszym kumplem mówisz liczb niewymiernych i diference między innymi numerami. Cóż, oboje zgadzają się w tym innego punktu widzenia:

Liczby niewymierne są relacje, jako funkcji, w sposób, jaki sposób? Cóż, myślę o „jeśli chcesz idealny okrąg, daj mi doskonałą PI”, ale koła są zmierzających do innych figur (4 boki, 5, 6 ... 100, 200), ale ... Ile jeszcze boki zrobić masz, bardziej jak kółko to wyglądać. Jeśli po mnie tak daleko, łącząca wszystkie te pomysły Oto wzór pi: wprowadzić opis obrazu tutaj

Tak, PI jest funkcją, ale taki, który nigdy się nie kończy! ze względu na parametr ∞, ale lubię myśleć, że można mieć „Wystąpienie” pi, jeśli zmienić parametr ∞ dla bardzo dużego Int, trzeba będzie bardzo duży instancji PI.

Podobnie jest z e, daj mi ogromną parametr, dam wam ogromny e.

Umieszczenie wszystkich pomysłów ze sobą:

Ponieważ mamy ograniczenia pamięci, języka i libs dostarczyć nam ogromne wystąpienie liczb niewymiernych, w tym przypadku, PI i E, jako wynik końcowy, trzeba będzie długo Aproach dostać 0, jak przykładów podanych przez @Chris Jester-Young

Odpowiedział 06/05/2017 o 03:07
źródło użytkownik

głosy
2

Jest to ograniczenie naszych obecnych zmiennoprzecinkowych architektur obliczeniowych. Arytmetyce zmiennoprzecinkowej jest tylko przybliżeniem biegunów numerycznych, takich jak e lub PI (lub czegokolwiek poza precyzją twoje bity pozwalają). Bardzo lubię te numery, bo przeczą one klasyfikacji i wydają się mieć większą entropię (?) Niż nawet liczb pierwszych, które są kanoniczne serii. reprezentacja numeryczna stosunku Defy za czasami proste rzeczy, jak to może wysadzić umysł osoby (kocham go).

Na szczęście całe języki i biblioteki mogą być przeznaczone do precyzyjnych funkcji trygonometrycznych przy użyciu pojęć notacyjne (podobne do opisanych przez Lasse V. Karlsen ).

Rozważmy Library / język opisujący pojęć takich jak e i pi w formie, że maszyna może zrozumieć. Czy maszyna ma żadnego pojęcia co to jest idealny okrąg? Prawdopodobnie nie, ale można utworzyć obiekt - krąg, który spełnia wszystkie znane elementy Przypisujemy do niego (stały promień, związek o promieniu na obwodzie wynosi 2 * pi * R = C). Przedmiotem PI jak opisano tylko wspomnianego stosunku. R & C mogą być opisane przez obiekty liczbowe cokolwiek precyzja chcesz im dać. E może być zdefiniowana „a e jest unikatowy tak, że liczba rzeczywista wartość pochodnej (nachylenie linii stycznej) funkcji f (x) = ex w punkcie x = 0, to dokładnie 1” z Wikipedia .

Zabawa pytanie.

Odpowiedział 20/11/2009 o 21:37
źródło użytkownik

głosy
2

Analiza numeryczna uczy nas, że nie można polegać na precyzyjnej wartości niewielkich różnic pomiędzy dużymi liczbami.

To nie tylko wpływa na równanie w kwestii tutaj, ale może doprowadzić do niestabilności wszystko od rozwiązywania niemal osobliwy zestaw równań, poprzez znalezienie zer wielomianów, do oceny dziennika (~ 1) lub exp (~ 0) ( i widziałeś nawet specjalne funkcje dla oceny log (x + 1) i (exp (x) -1), aby obejść ten temat).

Chciałbym zachęcić was, aby nie myśleć w kategoriach zerowania różnicę - nie może - ale raczej w sposób związane z tym obliczenia w taki sposób, aby zapewnić minimalny błąd.

Przykro mi, że to 43 lat, ponieważ miałem to bębnił do mnie na uni, a nawet jeśli nie pamiętam odniesienia, jestem pewien, że to lepsze rzeczy wokół teraz. Proponuję to jako punkt wyjścia.


Jeśli to brzmi nieco protekcjonalny, przepraszam. Mój „Analiza numeryczna 101” był częścią mojego kursu chemii, gdyż w tamtych czasach nie było zbyt wiele CS. I tak naprawdę nie mają czuć na miejscu / analiza numeryczna ma znaczenie w nowoczesnym oczywiście CS.

Odpowiedział 26/12/2008 o 22:22
źródło użytkownik

głosy
2

W rzeczywistości, w jaki sposób można reprezentować I (lub j dla inżynierów) w tradycyjnym języku programowania?

W języku, który nie posiada natywną reprezentację, to dodaje się zwykle przy użyciu OOP, aby utworzyć Complexklasę do reprezentowania ii j, ze operator przeciążenia właściwie radzić sobie z operacji z udziałem innych Complexnumerów i lub innych prymitywów liczba rodzimych języka.

Np Complex.java , C ++ <kompleks>

Odpowiedział 25/08/2008 o 14:48
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more