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.
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 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_epsilonTulos 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)