Maskinnoll ( Machine zero ) är ett numeriskt värde med en sådan negativ exponent, som av maskinen uppfattas som noll [1] .
Machine epsilon är ett numeriskt värde under vilket det är omöjligt att ställa in relativ precision för någon algoritm som returnerar reella tal . Det absoluta värdet av "maskin epsilon" beror på bitbredden på rutnätet som används av datorn , typen (bitlängd) som används i beräkningarna av siffrorna och på strukturen för representationen av reella tal som används i en viss översättare (antal bitar tilldelade per mantissa och per order). [2] Formellt definieras en maskinepsilon vanligtvis som det minsta antal ε för vilket 1+ε>1 i maskinberäkningar med tal av denna typ [3] . En alternativ definition är den maximala ε, för vilken likheten 1+ε=1 är giltig.
Den praktiska betydelsen av maskin epsilon beror på det faktum att två (icke-noll) tal är lika ur maskinaritmetisk synvinkel om deras relativa skillnad i absolut värde är mindre (när man definierar den första typen) eller inte överstiger (när man definierar den andra typen) maskin epsilon.
Det finns gränskonstanter i C-språket FLT_EPSILON, DBL_EPSILON och LDBL_EPSILON som är "maskin-epsilon" som motsvarar den första definitionen: FLT_EPSILON = 2 −23 ≈ 1.19e -07 är maskin-epsilon för flyttal (32 bitar −5), DBL_2EPSILON ≈ 2.20e-16 för dubbel typ (64 bitar) och LDBL_EPSILON = 2 −63 ≈ 1.08e-19 för lång dubbel typ (80 bitar). Med en alternativ definition skulle motsvarande maskinepsilon vara hälften: 2 −24 , 2 −53 och 2 −64 . Vissa C-kompilatorer (t.ex. gcc, Intels C/C++-kompilator) tillåter användning av variabler med fyrprecision (_float128 , _Quad). Motsvarande maskinepsilon är 2 −112 ≈ 1,93e-34 och 2 −113 ≈ 9,63e-35.
Ett exempel på beräkning av maskin epsilon (inte att förväxla med maskin noll) i C -språk .
float macheps ( ogiltig ) { float e = 1,0f ; medan ( 1.0f + e / 2.0f > 1.0f ) e /= 2,0f ; returnera e ; }Ett exempel i C++ .
# inkluderar <iostream> # include <stdint.h> # inkluderar <iomanip> mall < typnamn float_t , typnamn int_t > float_t machine_eps () { union { float_t f ; int_t i ; } one , one_plus , little , last_little ; en . f = 1,0 ; lite . f = 1,0 ; sista_lilla . f = lite . f ; medan ( sant ) { one_plus . f = en . f ; one_plus . f += lite . f ; if ( en . i != one_plus . i ) { sista_lilla . f = lite . f ; lite . f /= 2,0 ; } annan { returnera last_little . f ; } } } int main () { std :: cout << "maskin 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 ; }Exempel i Python
def machineEpsilon ( func = flyta ): machine_epsilon = func ( 1 ) medan func ( 1 ) + func ( machine_epsilon ) != func ( 1 ): machine_epsilon_last = machine_epsilon machine_epsilon = func ( machine_epsilon ) / func ( 2 ) return machine_epsilonUtdata kan vara så här (med IPython ):
I[1]: machineEpsilon(int) Ut[1]: 1 In[2]: machineEpsilon(float) Ut[2]: 2.2204460492503131e-16 I[3]: machineEpsilon(komplex) Ut[3]: (2.2204460492503131e-16+0j)