Vra

Die meeste wiskundiges stem saam dat:

  

e πi + 1 = 0

Die meeste drywende punt implementering verskil. Hoe goed kan ons skik hierdie saak?

Ek is gretig om te hoor oor verskillende tale en implementering, en verskillende metodes om die resultaat so naby aan nul as moontlik te maak. Wees kreatief!

Was dit nuttig?

Oplossing

Dit is nie dat die meeste swaai punt implementering verskil, dis net dat hulle die akkuraatheid wat nodig is om 'n 100% antwoord kry nie kan kry. En die korrekte antwoord is dat hulle nie kan nie.

PI is 'n oneindige reeks syfers wat niemand kan dui deur enigiets anders as 'n simboliese voorstelling is, en e ^ X is dieselfde, en dus die enigste manier om 100% akkuraatheid te kry is simbolies te gaan.

Ander wenke

Hier is 'n kort lys van die implementering en tale Ek het probeer. Dit is gesorteer volgens nabyheid aan nul:

  • Skema: (+ 1 (make-polar 1 (atan 0 -1)))
    • 0.0+1.2246063538223773e-16i (Chez Skema, MIT Skema)
    • 0.0+1.22460635382238e-16i (Guile)
    • 0.0+1.22464679914735e-16i (Hoender met numbers eier)
    • 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
  • Python: from cmath import exp, pi; exp(complex(0, pi)) + 1
    • 1.2246467991473532e-16j (CPython)
  • Ruby: 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

Is dit moontlik om hierdie geskil te besleg?

My eerste gedagte is om te kyk na 'n simboliese taal, soos Maple . Ek dink nie wat tel as drywende punt though.

In werklikheid, hoe 'n mens verteenwoordig i (of j vir die ingenieurs) in 'n konvensionele programmeringstaal?

Miskien 'n beter voorbeeld is sonde (π) = 0? (Of het ek die punt gemis weer?)

Ek stem saam met Ryan, sal jy nodig het om te beweeg na 'n ander nommer verteenwoordiging stelsel. Die oplossing is buite die grense van drywende punt wiskunde omdat jy pi te verteenwoordig as 'n oneindig lang desimale so 'n beperkte akkuraatheid skema net is nie van plan om te werk (ten minste nie sonder die gebruik van 'n soort van fudge-faktor te make-up die verlore nodig presisie).

Jou vraag lyk 'n bietjie vreemd vir my, as jy blyk te wees wat daarop dui dat die wisseltrofee Point wiskunde geïmplementeer deur die taal. Dit is oor die algemeen nie waar nie, as die FP wiskunde is gedoen met behulp van 'n drywende punt verwerker in hardeware. Maar sagteware of hardeware, drywende punt sal altyd verkeerd wees. Dit is net hoe dryf werk.

As jy 'n beter akkuraatheid moet jy nodig het om 'n ander nommer verteenwoordiging gebruik. Net soos as jy doen heelgetal wiskunde op getalle wat nie pas in 'n int of lank. Sommige tale het biblioteke vir daardie gebou in (ek weet java het Biginteger en BigDecimal), maar jy wil hê om uitdruklik te gebruik dié biblioteke in plaas van inheemse soorte, en die prestasie sou (aansienlik soms) wees erger as wanneer jy gebruik dryf.

@Ryan Fox

Trouens, hoe 'n mens verteenwoordig i (of j vir die ingenieurs) in 'n konvensionele programmeringstaal?

Native komplekse tipes data is ver van onbekende. Fortran het dit teen die middel-sestigerjare, en die OP vertoon 'n verskeidenheid van ander tale wat hulle ondersteun in hist opvolging.

En komplekse getalle kan word na ander tale bygevoeg as biblioteke (met operateur oorlaai hulle selfs lyk net soos inheemse soorte in die kode).

Maar tensy jy 'n spesiale geval voorsiening te maak vir hierdie probleem, die "non-ooreenkoms" is net 'n uitdrukking van vaag masjien rekenkundige, geen? Dis soos kla dat

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

eindig met (t! = 0) (Ten minste as jy 'n dom genoeg samesteller gebruik) ...

Ek het looooong koffie geselsies met my beste pal praat oor Irrasionale getalle en die verskil tussen 'n ander getalle. Wel, beide van ons saamstem in hierdie ander oogpunt:

Irrasionale getalle is verhoudings, soos funksies, op 'n manier, watter manier? Wel, dink oor "as jy 'n perfekte sirkel wil, gee my 'n perfekte pi", maar sirkels is diferent om die ander figure (4 kante, 5, 6 ... 100, 200), maar ... Hoeveel meer kante doen jy het, meer soos 'n sirkel dit lyk. As jy my tot dusver gevolg het, die koppeling van al hierdie idees hier is die pi formule: betree beeld beskrywing hier

So, pi is 'n funksie, maar een wat nooit eindig! as gevolg van die parameter ∞, maar ek hou van om te dink dat jy kan hê "geval" van pi, as jy die ∞ parameter vir 'n baie groot Int verander, jy sal 'n baie groot pi byvoorbeeld het.

Dieselfde met e, gee my 'n groot parameter, sal ek jou 'n groot e gee.

Om al die idees saam:

As ons 'n geheue beperkings, die taal en libs aan ons verskaf groot aandrang van irrasionale getalle, in hierdie geval, pi en e, as finale uitslag, sal jy 'n lang hoek te benader moet kry 0, soos die voorbeelde wat deur @Chris Nar-Young

  

In werklikheid, hoe 'n mens verteenwoordig i (of j vir die ingenieurs) in 'n konvensionele programmeringstaal?

In 'n taal wat nie 'n boorling verteenwoordiging het nie, is dit gewoonlik bygevoeg behulp van OOP om 'n Complex klas te i en j verteenwoordig skep, met operateur oorlaai om behoorlik te hanteer bedrywighede met betrekking tot ander Complex getalle en of ander nommer primitiewes moedertaal om die taal.

Bv: Complex.java , C ++

Numeriese Analise leer ons dat jy nie kan staatmaak op die presiese waarde van klein verskille tussen groot getalle.

Dit beteken nie net invloed op die vergelyking in vraag hier, maar kan onstabiliteit te bring om alles van die oplossing van 'n naby-enkelvoud stel gelyktydige vergelykings, deur die vind van die nulle van polinome, om te evalueer log (~ 1) of exp (~ 0) (Ek het selfs gesien spesiale funksies vir die evaluering van log (x + 1) en (exp (x) -1) te kry rondom hierdie).

Ek wil julle nie aanmoedig om te dink in terme van Nulstellen die verskil - jy kan nie - maar eerder om dit te doen die gepaardgaande berekeninge in so 'n manier om die minimum fout te verseker

.

Ek is jammer, dis 43 jaar sedert ek het hierdie bodem in my by uni, en al sou ek die verwysings kan onthou, ek is seker daar is beter dinge om nou. Ek stel voor hierdie as 'n beginpunt.


As dit klink 'n bietjie neerbuigend, ek vra om verskoning. My "Numeriese Analise 101" was deel van my chemie natuurlik as daar baie CS was nie in daardie dae. Ek het nie regtig 'n gevoel vir die plek / belangrikheid numeriese analise het in 'n moderne CS kursus.

Dit is 'n beperking van ons huidige drywende punt computational argitekture. Floating point rekenkundige is slegs 'n benadering van numeriese pale soos e of pi (of enigiets buite die akkuraatheid van jou stukkies toelaat). Ek geniet dit om te hierdie getalle omdat hulle klassifikasie daag, en verskyn om groter entropie het (?) As selfs primes, wat 'n kanoniese reeks is. numeriese verteenwoordiging A verhouding Defy se, soms eenvoudige dinge soos wat kan n persoon se gedagtes (Ek is mal daaroor).

blaas

Gelukkig hele tale en biblioteke kan gewy word aan presisie trigonometriese funksies met behulp van notasie konsepte (soortgelyk aan dié beskryf deur Lasse V. Karlsen ).

Oorweeg 'n biblioteek / taal wat begrippe soos e en pi beskryf in 'n vorm wat 'n masjien kan verstaan. Maak 'n masjien het 'n idee van wat 'n perfekte sirkel is? sirkel wat al die bekende funksies wat ons skryf dit (konstante radius, verhouding met radius om omtrek is 2 * pi * r = C) voldoen - waarskynlik nie, maar ons kan 'n voorwerp te skep. 'N voorwerp soos pi is net beskryf deur die bogenoemde verhouding. R & C kan wees numeriese voorwerpe beskryf deur watter presisie jy wil aan hulle te gee. e kan gedefinieer word "as die e is die unieke reële getal sodanig dat die waarde van die afgeleide (helling van die raaklyn) van die funksie f (x) = ex in die punt x = 0 is presies 1" van Wikipedia .

Fun vraag.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top