Nel contesto dell'analisi statica, sono interessato a determinare i valori di x
nell'allora succursale del condizionale sotto:Algoritmo più veloce per identificare la x più piccola e più grande che crea l'equazione a doppia precisione x + a == b vero
double x;
x = …;
if (x + a == b)
{
…
a
e b
può essere assunto come costanti doppia precisione (generalizzando alle espressioni arbitrarie è la parte più facile del problema), e il compilatore può presumere seguire IEEE 754 strettamente (FLT_EVAL_METHOD
è 0). Si può presumere che la modalità di arrotondamento in fase di esecuzione sia prossima a pari.
Se il calcolo con i costi era economico, sarebbe semplice: i valori per x
sarebbero i numeri a precisione doppia contenuti nell'intervallo razionale (b - a - 0.5 * ulp1 (b) ... b - a + 0.5 * ulp2 (b)). I limiti dovrebbero essere inclusi se b
è pari, escluso se b
è dispari, e ulp1 e ulp2 sono due definizioni leggermente diverse di "ULP" che possono essere prese identiche se non si preoccupa di perdere un po 'di precisione sulle potenze di due.
Sfortunatamente, il calcolo con i costi può essere costoso. Si consideri che un'altra possibilità è ottenere ciascuno dei limiti per dicotomia, in 64 aggiunte a doppia precisione (ciascuna operazione che decide un bit del risultato). 128 aggiunte in virgola mobile per ottenere i limiti inferiore e superiore potrebbero essere più veloci di qualsiasi soluzione basata sulla matematica.
Mi chiedo se c'è un modo per migliorare l'idea di "128 floating-point additions". In realtà, ho una mia soluzione che comporta cambiamenti della modalità di arrotondamento e chiamate nextafter
, ma non vorrei ostacolare lo stile di nessuno e far sì che perdano una soluzione più elegante di quella che attualmente possiedo. Inoltre, non sono sicuro che la modifica della modalità di arrotondamento due volte sia effettivamente più economica di 64 aggiunte in virgola mobile.
Si può usare la ricerca binaria per bisectare i valori che si desidera? Sembrerebbe che questo dovrebbe essere possibile poiché il numero di bit è basso. – templatetypedef
@templatetypedef la soluzione "128 floating-point additions" che abbozzo out è una ricerca binaria sulla rappresentazione di numeri in virgola mobile e quella che non voglio mostrare perché non so se sia effettivamente un il miglioramento riduce l'intervallo iniziale a bisecare calcolando una gamma di candidati troppo approssimata, che dovrebbe quindi essere perfezionata dalla ricerca binaria. –
@templatetypedef Sto sperando che qualcuno possa inventare un teorema dell'aritmetica in virgola mobile che risolva il problema in modo più elegante. –