dividere per zero in Nim

Scritto da Andrea Manzini

“verso l’infinito, e oltre”

Storicamente nei calcolatori la divisione per zero, in quanto operazione impossibile, è sempre stata gestita in modo problematico. I primi calcolatori elettromeccanici si inceppavano ed entravano in un loop infinito, dal quale si poteva uscire solo con una apposita operazione o spegnendo e riaccendendo tutta la macchina, che a causa dello sforzo richiesto rischiava anche di deteriorarsi e/o subire danni fisici.

In Nim la situazione non è così drammatica ma può portare ad alcune sorprese. Anzitutto se proviamo con un

let x=1/0
echo "Risultato=", x

Risultato=inf

a primo impatto otteniamo un valore infinito , che ci da anche problemi nel caso volessimo testare tale eventualità. Non possiamo infatti confrontare nessun numero con “inf” perchè sarebbe un simbolo non contemplato dal linguaggio.

Un modo corretto per identificare il caso, o meglio classificarlo, potrebbe essere ad esempio

import math
for n in countup(-5,5):
  let x=100/n  
  if x.classify == fcInf:
    echo "hai diviso per zero"  
  else:    
    echo "Risultato=",x

questa apparente “stranezza” viene dal fatto che la divisione con l’operatore / è sempre una divisione float, e dato che Nim rispetta lo standard per il calcolo a virgola mobile IEEE 754, otteniamo il risultato previsto dallo standard. Per chi volesse approfondire la questione, lascio un link al documento.

Se invece del risultato inf volessimo avere sollevata una eccezione, possiamo compilare il codice con lo switch --infChecks:on.

L’eccezione è il comportamento di default quando usiamo l’operazione di divisione intera con l’operatore div :

import math
for n in countup(-5,5):
  let x=100 div n  
  echo "Risultato=",x

eseguendo questo codice, otteniamo un errore sotto forma di Exception, che a questo punto saremo in grado di gestire con il costrutto try .. except del linguaggio.

Error: unhandled exception: division by zero [DivByZeroDefect]

come considerazione finale: anche Hitler ha imparato a sue spese che non si può dividere per zero …