szamok osztasa pontossag

Kezdőlap Fórumok Programozás szamok osztasa pontossag

7 bejegyzés megtekintése - 1-7 / 7
  • Szerző
    Bejegyzés
  • #1890365
    kat
    Felhasználó

      Sziasztok!1.0/0.52650000,

      #2205090
      pointux
      Felhasználó

        Ez abból adódik, hogy a számítógép 2-es alapú a te általad megjelenített szám 10-es alapú.A 10 nem írható fel 2 hatványaként, így a (10-es) nagyságrendileg nem azonos számok elvből sem lehetnek azonosak.Azaz így bizonyos számjegynél már kerekítve lesznek.Jelen esetben - mivel két szám hányadosa szerepel - két kerekítési probléma kiolthatja egymást. (Persze más-más precizitás esetén lehet máshol az eredmény, vagy lehet az adott számjegyig azonos az eredmény.)Pl. double a = ( double ) x / ( double ) y, ahol x, y az előbbi számokill. long double b = ( long double ) x / ( long double ) y, ahol x, y az előbbi számokAz utóbbi esetben látni fogod a különbséget már a két utóbbi esetben is, kivéve, ha a long double és a double nem azonosan van definiálva..(Más, más fordítóknál, arhitektúrában két típus lehet akár azonos pontosságú is.)Persze abban az esetben, ha nem 10-es számrendszerben határozod és iratod ki a számokat, hanem bináris, vagy pl. hexadecimálisban, akkor az eredményben (tárolásban) nem lesz kerekítési hiba a nagyságrendek között.Nem tudom, hogy érthető-e.

        #2205091
        kat
        Felhasználó

          Koszonom a reszletes valaszt!Meg egy kerdes: 1.0/0.5265 = 10.0/5.265, viszont kulonbozik 1000.0/526.5=0.1/0.05265-tol..Mellesleg az elso ketto feliras ad kozelebbi erteku valaszt a valodi ertekhez. Azert lehet ez, mert az elso kettonel legalabb az egyik szam felirhato extra 10^x nelkul ugy ahogyan van? Ha nincs szukseg exponensre akkor kihasznalja a megmaradt biteket? Vagy van egy lefoglalt resz, ami az exponensnek van felreteve es azok csak 0-k maradnak?

          #2205092
          pointux
          Felhasználó

            A számábrázolás úgy történik, hogy van egy 1 bites előjel + x bites mantissza + egy y bites exponenciális tag (2 valamely hatványa – természetesen.) Mint egy normál alak:Mondjuk, ha 10-es számrendszerben tárolódnának az adatok és lenne mondjuk 1 + 4 + 5 számjegy, akkor-125,5 = 1 + 1255 + 2 (tehát van egy minusz, ami mondjuk 1, van egy szám, és van egy kitevő, azaz -1,255 * 10^2)+2,12345678 = 0 + 2123 + 0 (azaz, +2,123 * 10^0, itt látható a következő probléma a mantissza tag pl. túlcsordult)Úgyanúgy túlcsordulhat az exponenciális tag is. Valami hasonló képpen tárolják a lebegőpontos számokat. (És mivel át kell váltani 10-esre előfordul - vagy az a gyakoribb - hogy egyik tag sem kerek a 10-es számrendszeren.)*Azaz az integerrel ellentétben itt két túlcsordulás lehetséges. Plusz az előbb említett probléma, hogy - mint említettem 10 soha nem írható fel 2 hatványaként így a szám mindig kerekített, ráadásul nem lehet pontosan tudni, hogy egy szám hány tizedesjegyig pontos (mert ez ugye attól függ, hogy hány kettes alapú bittel írható fel a 10-es szám)Így pl. egy32 bites float (single) jegye 6 tól 9 jegyig lehet pontos (a többi szemét). Ebből a leggyengébb láncszem a 6. Tehát 6 a biztos, hogy jó.Ennek az analógiájára egy64 bites double 15 jegyig biztosan pontos80 bites long double 19 jegyig128 bites long double 33 jegyig.Azaz nem szabad elkövetni azt a hibát, hogy végtelen pontosságú.Azaz pl. egy 5,125 és egy 51,25 csak akkor egyenlő biztosan egymással, ha 6 számjegyre van kerekítve. Egy számításnál esetleg elveszhet a kerekítések miatt még pontosság. Úgyhogy egy osztásnál már 5 lehet biztonságos. Ha a műveletsor bonyolultabb (de mindig float a szám és nincsen közben elhagyás), akkor azt hiszem a 4 a biztonságos. (De ezt ne vedd készpénznek, nem számoltam ki, csak hasamra ütöttem.)Ez a te esetedben is igaz lehet mert 15-1, azaz 14 számjegyed azonos.* Most "ugyanez" kettes számrendszer esetén 10-re váltva:Pl. 32 bites szám esetén a tárolás a következő képpen történik:31: előjel30-23: exponenciális tag22-0: mantisszaEz az alak kissé bonyolultabbexponenciális tag 10-es számrendszerre való átírása, ha minden igaz:2^( ( sum(i=23-31) 2^(bi-23) ) - 127 ), ahol i a bit helye, bi az adott helyen lévő bit (tehát ez olyan, mint egy byte, csak kitevőben van és azért x - 127, mert negatív és pozitív irányba is mehet)a mantisszáé, vagy törtrészé1 + ( sum(i=0-22) 2^(bi-23) ), ahol i a bit helye, bi az adott helyen lévő bit (ez meg egy 1 <= szám < 2 és nem kell negatív irányba mennie, mert arra ott a kitevő bitje - technikai kérdés, hogy hol van)és e kettő szorzata adja meg a számot. Az elsőt növelve nő a kitevő, a másodikat pedig a tizedes számjegyek száma az 1 és 2 közötti finomság növelésével.Így e szorzattal, ha nem is külön-külön felírható egy szám pontosan (egy bizonyos határig, jelen esetben biztosan csak 6 jegyig), de általában sokkal több tizedesjegy kell hozzá pl. egy olyan egyszerű szám, mint a 0,05 úgy fog kinézni, hogy 1,6 * 0,031250, amíg pl. egy 0,5 megy egyszerűen 1 * 0,5. (elvileg)Látható, hogy "köze nincsen" egymáshoz a 2-es számrendszer miatt (10^-1-et nem lehet 2-es alapon felírni), ráadásul a 0,05-höz sokkal nagyobb pontosság kell.Ezáltal könnyen belátható, hogy habár 7,2 számjegyet képes tárolni egy float, az előzőek tükrében adódhat olyan eset hogy csak 6 jegyig pontos, sőt olyan is, hogy több, akár 9 jegyig is. És ezáltal az is, hogy x*10^n nem feltétlenül egyenlő x*10^n+m / 10^m decimális számmal egy float tipusban (legfeljebb egy szűkös határig).Remélem már mindenre magyarázatot adtam. Remélem ez már elég geek. 😀

            #2205093
            pointux
            Felhasználó

              És, hogy ne csak a száraz leírásd lásd, hanem a saját példádat is (pl. a float típusra):

              Code:
              decimális szám:

              #2205094
              kat
              Felhasználó

                Wow, igazan teljes leiras!Nagyon koszonom!

                #2205095
                erum
                Felhasználó

                  A mandatory requirement for some reason the use PowerShell or “shell be under windows?” Because if the latter, then IMHO look at the cygwin side.

                7 bejegyzés megtekintése - 1-7 / 7
                • Be kell jelentkezni a hozzászóláshoz.