Gép nulla

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. szeptember 25-én felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

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.

Programozási nyelveken

C nyelv

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

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)

Lásd még

Jegyzetek

  1. Numerikus módszerek. Lineáris algebra és nemlineáris egyenletek. Tanulmányi útmutató . — Directmedia, 2014-05-20. — 432 p. — ISBN 9785445838753 . Archiválva 2021. szeptember 7-én a Wayback Machine -nél
  2. Podbelsky V.V., Fomin S.S. Programozás C nyelven: Tankönyv. Moszkva: Pénzügyi és Statisztikai Kiadó, 2003.
  3. Igor Jusupovics Alibekov. Numerical Methods, U/P . - MGIU, 2008-01-01. — 221 p. — ISBN 9785276014623 . Archiválva 2021. szeptember 7-én a Wayback Machine -nél