index | project | pods | responsabili

NOME

perlnumber - semantiche dei numeri ed operazioni numeriche in Perl


SINOSSI

    $n = 1234;              # intero decimale
    $n = 0b1110011;         # intero binario
    $n = 01234;             # intero ottale
    $n = 0x1234;            # intero esadecimale
    $n = 12.34e-56;         # notazione esponenziale
    $n = "-12.34e56";       # numero specificato come stringa
    $n = "1234";            # numero specificato come stringa
    $n = v49.50.51.52;      # numero specificato come stringa, che a sua
                            # volta E<egrave> specifica in termini numerici [NdT]


DESCRIZIONE

Questo documento descrive come il Perl gestisce i valori numerici internamente.

In questa sede l'infrastruttura atta all'overloading degli operatori viene completamente ignorata. L'overloading degli operatori consente di creare comportamenti definiti dall'utente per i numeri, come operazioni su interi arbitrariamente larghi e su numeri in virgola mobile con precisione arbitraria, operazioni su numeri ``esotici'' come aritmetica modulare, aritmetica p-adica, e via dicendo. Per maggiori dettagli consultate overload.


Memorizzare i numeri

Perl può rappresentare internamenti i numeri in 3 modi diversi: come interi nativi, come numeri in virgola mobile nativi, e come stringhe decimali. Le stringhe decimali possono avere una parte in notazione esponenziale, come in "12.34e-56". In questo contesto, nativo indica ``un formato supportato dal compilatore C utilizzato per compilare perl''.

Il termine ``nativo'' non significa molto quando si parla di interi nativi, mentre lo è quando sono convolti i numeri in virgola mobile nativi. La sola implicazione del termine ``nativo'' sugli interi è che i limiti per i veri valori interi massimi e minimi supportati, sono vicini alle potenze di 2. Invece, i numeri in virgola mobile ``nativi'' hanno una fondamentale restrizione: possono rappresentare solo quei numeri che, quando vengono convertiti in una frazione binaria, hanno una rappresentazione relativamente ``corta''. Per esempio, 0.9 non può essere rappresentato con un numero in virgola mobile nativo, poiché la frazione binaria per 0.9 è infinita:

  binary0.1110011001100...

con la sequenza 1100 che si ripete di continuo. In aggiunta a questa limitazione, l'esponente dei numeri binari è ristretto se è rappresentato come un numero in virgola mobile. Su un normale hardware, i valori in virgola mobile possono memorizzare valori con al massimo 53 cifre decimali, e con esponenti binari compresi tra -1024 e 1024. In una rappresentazione decimale, ciò significa più o meno 16 cifre decimali, ed esponenti decimali nell'intervallo -304..304. Il risultato di tutto ciò è che Perl non può memorizzare un numero come 12345678901234567 come un numero in virgola mobile su tali architetture senza che si verifichi una perdita di informazione.

Allo stesso modo, le stringhe decimali possono rappresentare solo numeri con un'espansione decimale finita. Siccome si tratta di stringhe, e dunque di lunghezza arbitraria, non c'è praticamente un limite per l'esponente o per il numero di cifre decimali per questi numeri. (Ma tenete conto che ciò che stiamo discutendo sono le regole per la sola memorizzazione di questi numeri. Il fatto che si possano memorizzare numeri così ``grossi'' non implica che le operazioni su questi numeri useranno tutte le loro cifre significative. Per i dettagli consultate Operatori numerici e conversioni numeriche).

Difatti, i numeri memorizzati come interi nativi possono essere memorizzati sia nella forma nativa con segno, o nella forma nativa senza segno. Dunque, i limiti del Perl per i numeri memorizzati come interi nativi sono generalmente -2**31..2**32-1, con le opportune variazioni nel caso di interi a 64 bit. Ancora, questo non significa che Perl possa effettuare operazioni solo su interi compresi in questo intervallo: è possibile memorizzare molti più interi nel formato a virgola mobile.

Riassumento, il valori numerici del Perl possono memorizzare solo i numeri che hanno un'espansione decimale finita, o un'espansione binaria ``corta''.


Operatori numerici e conversioni numeriche

Come accennato in precedenza, Perl può memorizzare un numero in uno qualasisi dei tre formati, ma la maggior parte degli operatori solitamente capiscono solo uno dei tre. Quando un valore numerico è passato come argomento a tali operatori, viene convertito nel formato che l'operatore capisce.

Sono possibili sei conversioni:

  intero nativo         --> virgola mobile nativo       (*)
  intero nativo         --> stringa decimale
  floating point nativo --> intero nativo               (*)
  floating point nativo --> stringa decimale            (*)
  stringa decimale      --> intero nativo
  stringa decimale      --> virgola mobile nativo       (*)

Queste conversioni sono disciplinate dalle seguenti regole generali:

  • Se il numero sorgente può essere rappresentato nella forma di destinazione, viene utilizzata tale forma.

  • Se il numero sorgente è fuori dai limiti rappresentabili nella forma di destinazione, viene utilizzata una rappresentazione del limite più vicino (perdita di informazioni).

  • Se il numero sorgente è compreso tra due numeri rappresentabili nella forma di destinazione, viene utilizzata la rappresentazione di uno di essi (perdita di informazioni).

  • Nelle conversioni floating point nativo --> intero nativo la precisione del risultato è minore o uguale alla precisione del sorgentem (``Arrotondamento a zero'').

  • Se la conversione stringa decimale --> intero nativo non può essere ottenuta senza perdita di informazioni, il risultato è compatibile con la conversione stringa decimale -> virgola movile nativo --> intero nativo. In particolare, l'arrotondamento tende nettamente a zero, benché sia possibile che un numero come "0.99999999999999999999" venga arrotondato ad 1.

RESTRIZIONE: Le conversioni sopra contrassegnate con (*) implicano operazioni eseguite dal compilatore C. In particolare, bug e caratteristiche del compilatore usato, possono portare all'infrazione di qualcuna delle regole sopra riportate.


Varietà delle operazioni numeriche in Perl

Le operazioni in Perl che prendono un argomento numerico trattano tale argomento in uno di quattro modi diversi: possono forzarli in uno dei formati interi/floating/di stringa, oppure possono comportarsi in maniera diversa a seconda del formato dell'operando. Forzare un valore numerico in un formato particolare non cambia il numero memorizzato nel valore.

Tutti gli operatori che hanno bisogno di un argomento nel formato intero trattano l'argomento come nell'aritmetica modulare, ad esempio mod 2**32 su una architettura a 32 bit. sprintf "%u", -1 fornisce pertanto lo stesso risultato di sprintf "%u", ~0.

Operatori Aritmetici
Gli operatori binari + - * / % == != > < >= <= e gli operatori unari - abs e - tenteranno di convertire gli argomenti in interi. Se entrambe le conversioni sono possibili senza perdita di precisione e l'operazione può essere eseguita senza perdita di precisione, allora viene utilizzato il risultato intero. In caso contrario, gli argomenti vengono convertiti in formato in virgola mobile e viene utilizzato il risultato in virgola mobile. La memorizzazione delle conversioni nella cache (come descritto sopra) indica che la conversione in interi non scarta le parti frazionarie sui numeri in virgola mobile.

++
++ si comporta come gli altri operatori visti sopra, tranne che se si tratta di una stringa corrispondente al formato /^[a-zA-Z]*[0-9]*\z/ viene utilizzato l'incremento della stringa descritto in perlop.

Gli operatori aritmetici durante l'utilizzo di use integer
In ambiti in cui è in vigore use integer;, quasi tutti gli operatori elencati sopra forzeranno il/i loro argomento/i nel formato intero, e restituiranno un risultato intero. Le eccezioni, abs, ++ e --, non cambiano il proprio comportamento con use integer;.

Altri operatori matematici
Operatori come **, sin and exp forzano gli argomenti nel formato in virgola mobile.

Operatori bit a bit
Gli argomenti sono forzati nel formato intero, se non sono stringhe.

Operatori bit a bit durante use integer
Forza gli argomenti nel formato intero. Anche le operazioni di shift utilizzano internamente gli interi con segno piuttosto che di quelli senza segno di default.

Operatori che si aspettano un intero
Forzano l'argomento nel formato intero. Ad esempio, ciò è applicabile al terzo e quarto argomento di sysread.

Operatori che si aspettano una stringa
Forzano l'argomento nel formato stringa. Ad esempio, ciò è applicabile a printf "%s", $valore.

Sebbene il forzare un argomento in una forma particolare non cambia il numero memorizzato, Perl ricorda il risultato di tali conversioni. In particolare, poiché una tale conversione potrebbe richiedere tempo, viene eseguita solo la prima volta; ulteriori operazioni ripetute non avranno bisogno di effettuare nuovamente la conversione.


AUTORE

Ilya Zakharevich ilya@math.ohio-state.edu

Modifiche editoriali di Gurusamy Sarathy <gsar@ActiveState.com>

Aggiornamenti per la versione 5.8.0 di Nicholas Clark <nick@ccl4.org>


SI VEDA ANCHE

overload, perlop


TRADUZIONE

Versione

La versione su cui si basa questa traduzione è ottenibile con:

   perl -MPOD2::IT -e print_pod perlnumber

Per maggiori informazioni sul progetto di traduzione in italiano si veda http://pod2it.sourceforge.net/ .

Traduttore

Traduzione a cura di Michele Beltrame e dree.

Revisore

Revisione a cura di dree.


Mon Jun 11 22:02:17 2012