Negative Zero

Originally published by Howdy Pierce on November 17th 2017 6,483 reads

Howdy Pierce Hacker Mezzogiorno immagine del profilo

@howdypierceHowdy Pierce

Presidente e Fondatore

facebook sociale iconaTwitter sociale icona

Mia moglie porta la seguente storia che ogni volta che lei vuole fare il punto che sto pedante: Quando una delle mie figlie era in seconda elementare, il suo insegnante di matematica ha detto alla classe che qualsiasi numero diviso per zero è stato uno. Ho tratteggiato un’e-mail appassionata all’insegnante, insistendo sul fatto che il risultato doveva essere indefinito. Presumibilmente questa è la prova che a volte sono difficile essere in giro.

Risulta che lo scherzo potrebbe essere su di me — anche se è ancora difficile sostenere la risposta dell’insegnante di seconda elementare. Recentemente ho imparato un sacco di cose che non sapevo sulla matematica in virgola mobile:

  • C’è un valore per zero negativo, separato dal normale (positivo?) zero. Questi due zeri sono definiti uguali tra loro e tuttavia sono valori distinti.
  • x ÷ 0.0, per x ≠ ±0.0, non è un errore. Invece, il risultato è infinito positivo o infinito negativo, seguendo la solita convenzione dei segni.
  • Il caso di ±0.0 ÷ ±0.0 è un errore (in particolare è “non un numero” o NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, e -0.0 × 0.0 = -0.0

Queste regole derivano dallo “Standard per l’aritmetica in virgola mobile” IEEE 754, che standardizzava le rappresentazioni in virgola mobile su piattaforme. La versione più recente dello standard è stata completata nel 2008, ma la versione originale è stata rilasciata nel 1985, quindi questo comportamento non è nuovo. Le regole di cui sopra sono vere sia in C (gcc) e Swift sul mio Mac, e anche vero in Swift su un iPhone. Python su Mac supporta zero negativo per i float, ma genera un’eccezione quando si tenta di dividere per zero di qualsiasi segno.

Ci sono un paio di corollari sorprendenti a queste regole:

  • Perché 0.0 e -0.0 devono essere confrontati come uguali, il test (x< 0.0) non restituisce true per ogni numero negativo — fallisce per zero negativo. Pertanto, per determinare il segno di un valore zero, è necessario utilizzare la funzione di segno integrata della piattaforma, ad esempio Double.accedi a Swift. Oppure immagino che potresti manipolare a bit la rappresentazione grezza del doppio,che è molto la risposta di un programmatore C.
  • Se a = b ÷ c, non necessariamente segue che b = a × c, perché questo fallisce anche per il caso in cui c è zero di entrambi i segni.

Non sono un teorico dei numeri, ma trovo i concetti sopra sorprendenti.

Un problema immediato: L’infinito non è un numero, come zero o 3.25 o π. Piuttosto, l’infinito è un concetto. È vero che i numeri razionali sono numerabilmente infiniti – ma l’infinito non è un membro dell’insieme dei numeri razionali.

Inoltre, dal punto di vista della teoria dei numeri, la divisione per zero non ha senso. Si può capire perché se si ottiene preciso su ciò che significa divisione. Tecnicamente, ” divisione “è” moltiplicazione per l’inverso di un numero”, dove l’inverso soddisfa: a × a^-1 = 1. Zero è l’unico numero nell’insieme di numeri reali che semplicemente non ha inverso moltiplicativo. E poiché questo inverso non esiste, non possiamo andare in giro moltiplicando per esso.

Ma sicuramente le persone che hanno progettato numeri in virgola mobile sapevano tutto questo. Quindi, mi sono chiesto perché il comportamento descritto è stato scritto nello standard IEEE.

Per iniziare, consideriamo il problema che la matematica in virgola mobile sta cercando di affrontare. I numeri reali sono infinitamente infiniti, eppure desideriamo rappresentare questo intero insieme entro i limiti della memoria finita del computer. Con un doppio a 64 bit, ci sono 2 ^ 64 simboli possibili, e i progettisti dello standard IEEE stavano cercando di mappare questi simboli sull’insieme di numeri reali in un modo che era sia utile alle applicazioni del mondo reale che anche economicamente fattibile dati i vincoli del silicio dei primi anni ‘ 80. Dati i requisiti di base, sarebbero state utilizzate chiaramente approssimazioni.

Il ragionamento per lo zero negativo sembra risalire a un articolo del 1987 di William Kahan, un professore di Berkeley che è considerato il “padre della virgola mobile” e che in seguito ha vinto il Turing Award per il suo lavoro nella stesura di IEEE 754. Si scopre che l’esistenza di zero negativo è intimamente legata alla capacità di dividere per zero.

Iniziamo discutendo la solita ragione per cui la divisione per zero non è consentita. Un approccio ingenuo alla divisione per zero è l’osservazione che:

In altre parole, quando x diventa più piccolo, il risultato di 1/x diventa più grande. Ma questo è vero solo quando x si avvicina a 0 dal lato positivo (motivo per cui c’è quel piccolo segno più sopra). Esecuzione dello stesso esperimento mentale dal lato negativo:

Come risultato, il generico limite di 1/x per x che tende a 0 non è definito, perché c’è una discontinuità (cosa Kahan chiamate a fessura (slit) in funzione di 1/x.

Tuttavia, con l’introduzione di un firmato zero, Kahan e il comitato IEEE potrebbe risolvere la difficoltà. Intuitivamente, il segno di uno zero è preso per indicare la direzione da cui il limite viene avvicinato. Come afferma Kahan nel suo articolo del 1987:

Piuttosto che pensare a +0 e -0 come valori numerici distinti, pensa al loro bit di segno come una variabile ausiliaria che trasmette un bit di informazione (o disinformazione) su qualsiasi variabile numerica che assume 0 come suo valore. Di solito questa informazione è irrilevante; il valore di 3 + x non è diverso per x: = + 0 che per x: = -0…. Tuttavia, alcune operazioni aritmetiche straordinarie sono influenzate dal segno di zero; ad esempio 1/ (+0) = +∞ ma 1/ (-0) = –∞.

Ho fatto pace con il concetto adottando una razionalizzazione proposta dal mio partner Mike Perkins: I 2^64 simboli disponibili sono chiaramente inadeguati a rappresentare l’insieme dell’insieme dei numeri reali. Quindi, i progettisti IEEE hanno messo da parte alcuni di quei simboli per significati speciali. In questo senso, ∞ in realtà non significa ” infinito “-invece, significa ” un numero reale che è più grande di quanto possiamo altrimenti rappresentare nel nostro set di simboli in virgola mobile.”E quindi + 0 non significa veramente “zero”, ma piuttosto ” un numero reale che è più grande del vero 0 ma più piccolo di qualsiasi numero positivo che possiamo rappresentare.”

Per inciso, durante la ricerca di questo problema, ho scoperto che anche Kahan non ama l’idea di zero negativo:

Firmato zero — beh, lo zero firmato era un dolore nel culo che potremmo eliminare se usassimo la modalità proiettiva. Se ci fosse solo un infinito e uno zero si potrebbe fare bene; allora non ti importava del segno di zero e non ti importava del segno di infinito. Ma se, d’altra parte, hai insistito su quella che avrei considerato la scelta minore di due infiniti, allora finirai con due zeri firmati. Non c’era davvero un modo per aggirare questo e tu eri bloccato con esso.”(Da un’intervista di Kahan condotta nel 2005.)

Non sono sicuro che scrivere un post sul blog dieci anni dopo compensi la ringhiera contro un povero insegnante di seconda elementare. Da parte sua mia figlia, ora al liceo, ha appena alzato gli occhi quando ho iniziato a parlare di divisione per zero a cena. Quindi forse quella cosa del “difficile essere intorno” è ereditaria.

Kahan, W., “Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing’s Sign Bit” , Lo stato dell’arte nell’analisi numerica, (Eds. Iserles e Powell), Clarendon Press, Oxford, 1987, disponibile qui.

Tags

Join Hacker Noon

Create your free account per sbloccare la tua esperienza di lettura personalizzata.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *