Kone nolla

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 25. syyskuuta 2019 tarkistetusta versiosta . tarkastukset vaativat 6 muokkausta .

Koneen nolla ( Machine zero ) on numeerinen arvo, jolla on sellainen negatiivinen eksponentti, jonka kone näkee nollana [1] .

Koneen epsilon on numeerinen  arvo, jonka alapuolella on mahdotonta asettaa suhteellista tarkkuutta millekään reaalilukuja palauttavalle algoritmille . "Machine epsilonin" itseisarvo riippuu tietokoneen käyttämän ruudukon bittileveydestä, numeroiden laskennassa käytetystä tyypistä (bitin pituudesta) ja tietyssä kääntäjässä käytetystä reaalilukujen esityksen rakenteesta. (mantissaa ja tilausta kohden allokoitujen bittien määrä). [2] Muodollisesti koneepsilon määritellään yleensä minimiluvuksi ε, jolle 1+ε>1 konelaskuissa tämän tyyppisillä luvuilla [3] . Vaihtoehtoinen määritelmä on maksimi ε, jolle yhtälö 1+ε=1 on tosi.

Koneepsilonin käytännön merkitys johtuu siitä, että kaksi (ei-nollaa) lukua ovat konearitmeettisesti samat, jos niiden suhteellinen ero absoluuttisessa arvossa on pienempi (ensimmäistä tyyppiä määritettäessä) tai ei ylitä (määritettäessä toista tyyppiä) kone epsilon.

Ohjelmointikielillä

C-kieli

C-kielessä FLT_EPSILON, DBL_EPSILON ja LDBL_EPSILON on rajavakiot, jotka ovat "koneepsiloneja", jotka vastaavat ensimmäistä määritelmää: FLT_EPSILON = 2 −23 ≈ 1.19e-07 on koneepsilon float-luvuille (32 bittiä), DBL_EPS −5ILON2 =2 =2 −5ILON2 ≈ 2,20e-16 kaksoistyypille (64 bittiä) ja LDBL_EPSILON = 2 −63 ≈ 1,08e-19 pitkälle kaksoistyypille (80 bittiä). Vaihtoehtoisella määritelmällä vastaavat koneen epsilonit olisivat puolet: 2 −24 , 2 −53 ja 2 −64 Jotkin C-kääntäjät (esim. gcc, Intelin C/C++-kääntäjä) mahdollistavat nelitarkkuuden muuttujien käytön (_float128). , _neljä). Vastaavat koneepsilonit ovat 2 −112 ≈ 1,93e-34 ja 2 −113 ≈ 9,63e-35.

Esimerkki

Esimerkki koneen epsilonin laskemisesta (ei pidä sekoittaa koneen nollaan) C -kielellä .

float macheps ( tyhjä ) { float e = 1,0f ; while ( 1.0f + e / 2.0f > 1.0f ) e /= 2,0f ; paluu e ; }

Esimerkki C++ :ssa .

# sisältää <iostream> # sisältää <stdint.h> # sisältää <iomanipin> malli < typename float_t , typename int_t > float_t machine_eps () { liitto { float_t f ; int_t i ; } yksi , yksi_plus , pieni , viimeinen_pieni ; yksi . f = 1,0 ; vähän . f = 1,0 ; viimeinen_pieni . f = vähän . f ; kun ( tosi ) { yksi_plus . f = yksi . f ; yksi_plus . f += vähän . f ; jos ( yksi . i ! = yksi_plus . i ) { viimeinen_pieni . f = vähän . f ; vähän . f /= 2,0 ; } muu { paluu viimeinen_vähän . f ; } } } int main () { std :: cout << "kone epsilon: \n " ; std :: cout << "float:" << std :: setprecision ( 18 ) << machine_eps < float , uint32_t > () << std :: endl ; std :: cout << "double:" << std :: setprecision ( 18 ) << machine_eps < double , uint64_t > () << std :: endl ; }

Esimerkki Pythonissa

def machineEpsilon ( func = float ): machine_epsilon = func ( 1 ) while func ( 1 ) + func ( machine_epsilon ) != func ( 1 ): machine_epsilon_last = kone_epsilon machine_epsilon = func ( machine_epsilon ) / func ( 2 ) return machine_epsilon

Tulos voisi olla tällainen ( IPythonilla ):

In[1]: koneEpsilon(int) Ulos[1]: 1 In[2]: koneEpsilon(kelluke) Out[2]: 2,2204460492503131e-16 In[3]: koneEpsilon(kompleksi) Out[3]: (2,2204460492503131e-16+0j)

Katso myös

Muistiinpanot

  1. Numeeriset menetelmät. Lineaarialgebra ja epälineaariset yhtälöt. Opinto-opas . — Directmedia, 20.5.2014. — 432 s. — ISBN 9785445838753 . Arkistoitu 7. syyskuuta 2021 Wayback Machinessa
  2. Podbelsky V.V., Fomin S.S. Ohjelmointi C:ssä: Oppikirja. Moskova: Finance and Statistics Publishing House, 2003.
  3. Igor Yusupovich Alibekov. Numeeriset menetelmät, U/P . - MGIU, 2008-01-01. — 221 s. — ISBN 9785276014623 . Arkistoitu 7. syyskuuta 2021 Wayback Machinessa