Det är lite oklart vad som hände igår när en väldigt stor köporder lades på Stockholmsbörsen, men det ger lite inblick i den digitala infrastrukturen.
Det intressanta var att ordern var just 4 294 967 290 eftersom det ligger väldigt nära 4 294 967 296 som är 232. Det uppmärksammades bland annat av Jesper Larsson på Twitter, och då blev det troligt att det inte var en börsrobot som löpt amok, utan snarare en bugg i överföringen mellan olika system.
Om man inte har både positiva och negativa tal i datorsystemet är det vanligt att -1 representerar det största talet som finns. Det blir som att tal-linjen "går runt", och det funkar eftersom man i datorsystemet har bestämt vilket det största talet som representeras kan vara. Har man 32 binära bitar blir 4 294 967 290 samma sak som 232-6, som alltså lika gärna kan skrivas -6 i det systemet. (Att representera siffror så kallas "unsigned" eller "uint" (unsigned integer))
Den rysligt stora köpordern, på ca 130 gånger Sveriges BNP var kanske bara en kvantitet -6 som konverterades fel i något system. Ett par kommentarer till SVD-artikeln ger ytterligare inblick:
"simpim" skriver
Jag tror personligen på en omvandling från signed integer till unsigned integer. OMX införde nyligen en ny feature med vad de kallar True change of order (om jag kommer ihåg terminologin rätt), som innebar att man faktiskt kunde ändra en existerande order; innan dess kunde man bara göra vissa specifika förändringar, typ "Dra bort 5 från min volym". Så jag skulle tro att någon skickat in en modifiering av existerande order som såg OK ut i protokoll-valideringen, men när modifieringen gjordes längre in i systemet räknades en volym på -6 fram (dvs mer volym togs bort från en order än vad som fanns i marknaden), och när den volymen sen kom in i en del av systemet som vet att det är volymer det handlar om så tolkades siffran som en unsigned -> resultatet blev 2^32-6. Lätt hänt när man ändrar i existerande system!
och fortsätter med
Det interna OMX-systemet är skrivet i C så uint <-> int är definitivt något som kan gå fel där :-)
Varje sådant här unsigned integer-fält (och ingen vet hur många det finns) gör antagandet om världen att det som fältet representerar måste vara ett positivt värde (och att det inte får vara större än 232). Just en "kvantitet" kommer ju aldrig att bli mindre än 0, men det är helt nödvändigt att hålla koll på alla antaganden om världen som datorprogram gör.
Kanske kommer det en dag att finnas uttryckt hur man ska se på världen från den digitala infrastrukturens håll, typ "Om programmet ska kunna representera antalet päron i universum måste 64-bitars-tal användas." Systemutvecklaren (eller modelleraren i alla fall) behöver känna till mer och mer om hur världen är beskaffad.
Tack också till Victor Galaz för tips om artikeln!
/Simon
Comments
You can follow this conversation by subscribing to the comment feed for this post.