A gép nulla ( Machine zero ) egy ilyen negatív kitevővel rendelkező numerikus érték, amelyet a gép nullaként érzékel [1] .
A gépi epszilon egy olyan numerikus érték, amely alatt lehetetlen relatív pontosságot beállítani bármely olyan algoritmus esetében, amely valós számokat ad vissza . A "gép epszilon" abszolút értéke a számítógép által használt rács bitszélességétől, a számok számításánál használt típustól (bithossztól), valamint a valós számok ábrázolásának egy adott fordítóban alkalmazott szerkezetétől függ. (a mantisszánként és rendelésenként kiosztott bitek száma). [2] Formálisan a gépi epszilont általában úgy definiálják, mint azt a minimális ε számot, amelyre 1+ε>1 az ilyen típusú számokkal végzett gépi számításokban [3] . Alternatív definíció a maximum ε, amelyre igaz az 1+ε=1 egyenlőség.
A gépi epszilon gyakorlati jelentősége abból adódik, hogy két (nem nulla) szám gépi aritmetikai szempontból azonos, ha abszolút értékük relatív különbsége kisebb (az első típus meghatározásakor), vagy nem haladja meg (a második típus meghatározásakor) gép epszilon.
Vannak határállandók a C nyelvben FLT_EPSILON, DBL_EPSILON és LDBL_EPSILON, amelyek az első definíciónak megfelelő "gépi epsilon": FLT_EPSILON = 2 −23 ≈ 1.19e-07 gépi epszilon a lebegő számokhoz (32 bit), DBL_EPSILON2 =2 −EPSILON2 ≈ 2,20e-16 dupla típus esetén (64 bit), és LDBL_EPSILON = 2 -63 ≈ 1,08e-19 hosszú dupla típus esetén (80 bit). Alternatív definícióval a megfelelő gép epszilonok fele: 2 -24 , 2 -53 és 2 -64 Egyes C fordítók (pl. gcc, az Intel C/C++ fordítója) lehetővé teszik négyes pontosságú változók használatát (_float128 , _Négy). A megfelelő gép epszilonok 2 −112 ≈ 1,93e-34 és 2 −113 ≈ 9,63e -35.
Példa a gépi epsilon kiszámítására (nem tévesztendő össze a nulla géppel) C nyelven .
float macheps ( üres ) { float e = 1,0f ; while ( 1.0f + e / 2.0f > 1.0f ) e /= 2,0f ; visszatér e ; }Példa a C++ nyelven .
# include <iostream> # include <stdint.h> # include <iomanip> sablon < típusnév float_t , típusnév int_t > float_t machine_eps ( ) { szakszervezet { float_t f ; int_t i ; } one , one_plus , little , last_little ; egy . f = 1,0 ; kicsit . f = 1,0 ; last_little . f = kevés . f ; míg ( igaz ) { one_plus . f = egy . f ; one_plus . f += kevés . f ; if ( one . i != one_plus . i ) { last_little . f = kevés . f ; kicsit . f /= 2,0 ; } más { return last_little . f ; } } } int main () { std :: cout << "gép 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 ; }Példa Pythonban
def machineEpsilon ( func = float ): machine_epsilon = func ( 1 ) while func ( 1 ) + func ( machine_epsilon ) != func ( 1 ): machine_epsilon_last = machine_epsilon machine_epsilon = func ( machine_epsilon ) / func ( 2 ) return machine_A kimenet a következő lehet ( IPython használatával ):
In[1]: gépEpszilon(int) Ki[1]: 1 In[2]: gépEpszilon (úszó) Out[2]: 2,2204460492503131e-16 In[3]: gépEpszilon (komplex) Out[3]: (2,2204460492503131e-16+0j)