Objavljeno: 6.5.2015 08:00

Prekoračitve obsega v zgodovini

Ta teden je v javnosti zaokrožila novica, da imajo nova Boeingova letala 787 Dreamliner hrošča, ki bi lahko v izjemno redkem spletu okoliščin povzročil izgubo električne energije. Razlog je prekoračitev obsega števil, ki jih lahko shranimo v predznačeno 32-bitno celoštevilsko spremenljivko. Problem ni nov niti redek, razkriva BBC-jev pregled.

Če prvo mesto rezerviramo za predznak, lahko v tovrstno spremenljivko shranimo največ 2.147.483.647, kar je ravno 231-1. Prištejemo ena, pa se ponovno znajdemo na začetku, saj števec preteče obseg; podobno, kot bi avtomobilski pokazal 000000, če bi prevozili milijon kilometrov.

Dandanes zaradi nepazljivosti, včasih pa so se tovrstne pomanjkljivosti v kodo prikradle, ker nihče ni realistično mogel pričakovati, da bodo tako velika števila potrebna. Posledice so včasih zabavne, drugič pa katastrofalne.

Raketa Ariane 5, ki jo je Evropska vesoljska agencija (ESA) prvikrat poizkusno izstrelila 4. junija 1996, se je po 37 sekundah uničila. Razlog je bil recikliran kos programske kode iz Ariane 4, ki je zmogel shranjevati največ 16-bitna cela števila. Pri pretvarjanju 64-bitnih števil s plavajočo vejico v 16-bitno predznačeno celo število je prišlo do prekoračitve obsega. Vrsta nesrečnih odločitev pri dizajnu je povzročila, da je ta dogodek sprožil kaskado napak, ki je vodila do uničenja rakete.

Precej manj katastrofalen je števec ogledov na YouTubu, ki je bil svoj čas prav tako omejen na 32 bitov. Da to ne zadostuje, je pokazal korejski glasbenik Psy, čigar hit Gagnam Style je dobil več kot 2.147.483.647 ogledov. YouTube je napako hitro popravil, stranski učinek pa je bila še večja reklama tako za Psyja kakor YouTube.

Zloglasni hrošč Y2K, ki v resnici sploh ni povzročil tako hudih težav, kot so bili napovedovali, je podoben, a ne povsem enake provenience. Enako težavo pa bo povzročil problem leta 2038, ko bo Unixov čas – ki od 1. januarja 1970 ob 00:00:00 UTC enakomerno teče – presegel vrednost 2.147.483.647 sekund. To se bo zgodilo 19. januarja 2038 ob 03:14:07 UTC. Medtem ko 64-bitni sistemi že uporabljajo predznačeno 64-bitno celoštevilsko spremenljivko za time_t, je v 32-bitnih sistemih rešitev teže najti, če ne želimo žrtvovati združljivosti z obstoječimi sistemi.

Najbolj katastrofalna napaka pa je bila napačna pot vojaške rakete Patriot 25. februarja 1991 v zalivski vojni, ki je nastala kot posledica malomarne obravnave števil. Raketa ni zadela iraške rakete Scud, ki je zato padla na ameriško vojašnico in terjala 28 žrtev ter poškodovala več kot 100 ljudi. Tu ni šlo za prekoračitev obsega, ampak nepravilno zaokroževanje. Števila, shranjena s plavajočo vejico v dvojiškem sistemu, imajo omejeno natančnost, zato je treba paziti, da ne kopičimo numeričnih napak pri računih. 

Vrednosti 0,01 ne moremo natančno zapisati v dvojiškem sistemu, ker ima periodo. Nekje je torej treba odrezati, kar pri naivni uporabi aritmetike števil s plavajočo vejico prinaša numerične napake. Zato v programiranju 0,3 + 0,6 ni enako 0,9, temveč 0,89999999999999991 (odvisno seveda od števila bitov). Kje je to pomembno v vsakdanjem življenju? Na blagajnah, pri transakcijskih računih itd. Tam programska oprema vrednosti ne sme zapisovati v spremenljivkah s plavajočo vejico, temveč kot cela števila, ki predstavljajo večkratnike centov (ali desetink, stotink ... centov).

Naroči se na redna tedenska ali mesečna obvestila o novih prispevkih na naši spletni strani!

Komentirajo lahko le prijavljeni uporabniki

 
  • Polja označena z * je potrebno obvezno izpolniti
  • Pošlji