Pillole di Javascript: numeri e aritmetica

Il full-adder è il circuito logico in grado di eseguire un’addizione. E’ il circuito alla base del calcolo artimetico nei microprocessori. In figura lo schema logico del full-adder (fonte: https://it.wikipedia.org/wiki/Full-adder)

Uno dei tipi primitivi di Javascript è il tipo numerico (number). Questo tipo è usato sia per gli interi che per i decimali. Il valore numerico è rappresentate in memoria usando lo standard in virgola mobile IEEE-754 in una variabile a doppia precisione (64 bit). Lo standard prevede che, nell’eseguire i calcoli aritmetici, possano venire fatte delle approssimazioni. Un esempio evidente di ciò è l’espressione “0.1 + 0.2” che, paradossalmente, non ritorna 0.3, ma il valore approssimato “0.30000000000000004”.

Un letterale numerico in Javascript può essere espresso in diversi modi. Vediamo in dettaglio le varie possibilità.

Gli interi e decimali in base dieci sono espressi da un valore intero, eventualmente seguito dal carattere punto “.” e dalla parte decimale. Se la parte intera è zero, si può omettere. Non è considerato errore scrivere il punto dopo la parte intera e poi omettere la parte decimale, ovviamente sarà considerato un intero:

var intero = 42;
var decimale = .42;
var intero2 = 42.

E’ possibile usare la notazione esponenziale. Il valore deve essere seguito dal carattere “e” minuscolo oppure “E” maiuscolo, seguito dall’esponente. Esempi:

var n1 = 1.234e3; // 1234
var n2 = 1234e-3; // 1.234
var n3 = 42E2; // 4200
var n4 = -24e-2; // -0.24

La sintassi per i valori interi, decimali e per la notazione esponenziale può essere sintetizzata con la seguente espressione:

[(+|-)][digits][.[digits]][(E|e)[(+|-)]digits]

I valori esadecimali (in base 16) devono essere preceduti dai caratteri “0x” oppure “0X”.

var es1 = 0xFF;
var es2 = 0XFF;
var es3 = CAFE911;

La notazione ottale non è ufficialmente supportata dallo standard. Tuttavia molte implementazioni la riconoscono. La sintassi prevede di anteporre il carattere “0” prima del valore:

var ottale = 042; // equivale a 34 decimale

sempre per convenzione, se il valore contiene cifre maggiori di 7, viene interpretato come decimale. Considerando che non è una sintassi standard, è consigliato non farne uso.

Infine è possibile usare la notazione binaria, facendo precedere il valore binario dai caratteri “0b” oppure “0B”:

var b1 = 0B101010;
var b2 = 0b101010;

Se si usano cifre maggiori di uno verra sollevato un SyntaxError.

Sui valori numerici è possibile utilizzare i cinque operatori che implementano le operazioni aritmetiche classiche:

var somma = 40 + 2;
var sottrazione = 44 - 2;
var divisione = 84 / 2;
var moltiplicazione = 12 * 2;
var modulo = 85 % 43;

Per operazioni matematiche più complesse, e le costanti numeriche più utili, si possono utilizzare i metodi e le proprietà dell’oggetto Math. Possono essere utili anche le proprietà dell’oggetto Number:

Number.isFinite(num) // ritorna true se il num non è Infinity
Number.isInteger(num) // ritorna true se il num è intero
Number.isNan(num) // ritorna true se num è NaN (nota che NaN != NaN)
Number.NaN // costante con il valore NaN
Number.MAX_VALUE // costante con il massimo numero rappresentabile
Number.MIN_VALUE // costante con il numero più piccolo rappresentabile
Number.POSITIVE_INFINITY // costante con +Infinity
Number.NEGATIVE_INFINITY // costante con -Infinity

Il valore NaN (Not A Number) è un valore speciale che può essere assunto da una variabile numerica, e rappresenta il risultato di un’operazione che non ha significato matematico. Anche Infinity è un valore speciale, e rappresenta il valore infinito positivo, che è considerato diverso da -Infinity, che rappresenta il valore infinito negativo. Riguardo questi valori speciali è importante ricordare le seguenti regole:

  • un numero positivo diviso zero ritorna +Infinity, se negativo ritorna -Infinity
  • zero diviso zero ritorna NaN
  • Infinity diviso Infinity ritorna NaN
  • un overflow non solleva un errore, ma ritorna come risultato Infinity, eventualmente -Infinity se negativo
  • un underflow (cifra decimale troppo piccola per essere rappresentata) ritorna zero, senza dare errore
  • se uno degli operandi non è numerico, oppure l’operazione non ha senso (es: radice di un numero negativo), il risultato è NaN
Precedente Pillole di Javascript: i wrapper dei tipi primitivi Successivo Pillole di Javascript: stringhe