Sottrai il logaritmo massimo da tutti i registri. Butta via tutti i risultati che sono così negativi da sottovalutare l'esponenziale. (Le loro probabilità sono, a tutti gli effetti pratici, zero).
Infatti, se si desidera una precisione relativa di ε (come ϵ = 10- d per le cifre di precisione d ) e si hanno n probabilità, buttare via qualsiasi risultato inferiore al logaritmo di ϵ / n . Quindi procedere come al solito per esponenziare i valori risultanti e dividere ciascuno per la somma di tutti gli esponenziali.
λ1, λ2, ... , λnb > 1λn= max ( λio)b > 1
αio= { bλio- λn, λio- λn≥ log( ϵ ) - registro( n )0altrimenti .
Le probabilità normalizzate equivalgono a , Questo funziona perché la sostituzione di zero di tutti gli underflow con zero fa un errore totale al massimo considerando che, poiché e tutti sono non negativi, il denominatore , da cui l' errore relativo totale dovuto alla regola di sostituzione zero è strettamente inferiore a , come desiderato. i = 1 , 2 , … , n . α i ( n - 1 ) ϵ / n < ϵ α n = b λ n - λ n = b 0 = 1 α i A = ∑ j α j ≥ 1 ( ( n - 1αio/ ∑nj = 1αji = 1 , 2 , … , n .αio( n - 1 ) ϵ / n < ϵαn= bλn- λn= b0= 1αioA = ∑jαj≥ 1( ( n - 1 ) ϵ / n ) / A < ϵ
Per evitare troppi errori di arrotondamento, calcolare la somma iniziando con i valori più piccoli di . Questo verrà fatto automaticamente quando i vengono ordinati per la prima volta in ordine crescente. Questa è una considerazione solo per molto grandi .λ i nαioλion
A proposito, questa prescrizione presuppone che la base dei registri sia maggiore di . Per basi inferiori a , prima negare tutti i registri e procedere come se la base fosse uguale a .b 1 1 / b1B11 / b
Esempio
Lascia che ci siano tre valori con logaritmi (log naturali, diciamo) uguali a e L'ultimo è il più grande; sottraendolo da ciascun valore si ottiene e- 231444.981 , - 231444.699. - 38202.733 , - 0.282 , 0.- 269647.432 , - 231444.981 ,- 231444.699.- 38202.733 , - 0,282 ,0.
Supponiamo che desideri una precisione comparabile ai doppi IEEE (circa 16 cifre decimali), in modo che e . (Non puoi effettivamente raggiungere questa precisione, perché è dato solo a tre cifre significative, ma va bene: stiamo solo gettando via i valori che sono garantiti per non influenzare il meglio della precisione che desideri e la precisione che in realtà have.) Calcola = = La prima delle tre differenze, è inferiore a questa, quindi via, lasciando solo e dà n = 3 - 0.282 log ( ϵ / n ) log ( 10 - 16 ) - log ( 3 ) - 37.93997. - 38202.733 , - 0.282 0. exp ( - 0.282 ) = 0.754 exp ( 0 ) = 1 0 0.754 / ( 1 + 0.754 ) =ϵ = 10- 16n = 3- 0,282log( ϵ / n )log( 10- 16) - registro( 3 )- 37.93997.- 38202.733 ,- 0,2820.exp( - 0,282 ) = 0,754 e (ovviamente). I valori normalizzati sono - in ordine - per quello che hai gettato via, e .exp( 0 ) = 100.754 / ( 1 + 0.754 ) = 0.4301/(1+0.754)=0.570
log1p
funzione nella tua lingua? Questo utilizza l'espansione di Taylor intorno all'1.