2012-12-20 11 views
10

Ero sempre dal presupposto che la prova seguente sarà sempre successo per valori finiti (senza INF, non NAN) di somefloat:Per un valore in virgola mobile a: Fa * 0.0 == 0.0 sempre valutato vero per i valori finiti di a?

assert(somefloat*0.0==0.0); 

In Multiply by 0 optimization si è affermato che double a=0.0 e double a=-0.0 non sono strettamente parlando la stessa cosa.

Quindi mi chiedevo se questo può portare a problemi su alcune piattaforme, ad es. il risultato del test sopra riportato può dipendere dallo a in positivo o in negativo.

+0

Hai provato? –

+1

Lo standard C++ richiede che '+ 0.0' e' -0.0' abbiano lo stesso comportamento. La risposta che suggerisce diversamente nel thread che hai citato è errata, almeno per C e C++. –

+0

Sul mio computer che il mio compilatore va tutto bene, anche su un altro target embedded, ma ... Non voglio sorprese successive – Martin

risposta

9

Se la vostra implementazione utilizza l'aritmetica IEEE 754 (che la maggior parte fa), lo zero positivo e negativo sarà uguale. Poiché il lato sinistro della tua espressione può essere solo zero positivo o negativo per il numero finito a, l'asserzione sarà sempre vera.

Se utilizza un altro tipo di aritmetica, solo l'implementatore e, si spera, la documentazione specifica per l'implementazione, può dirlo. Probabilmente (si vedano i commenti) la formulazione dello standard può essere interpretata in modo da implicare che devono comunque essere uguali tra loro e sicuramente nessuna implementazione sana farebbe altrimenti.

+0

La documentazione non è specifica dell'implementazione; lo standard C++ richiede che lo zero positivo e negativo siano uguali. (Del resto, non posso concepire un'implementazione in cui non sarebbero paragonabili: sarebbe inutilizzabile.) –

+0

@James Hai un riferimento dallo standard? –

+0

@JamesKanze: Sono d'accordo che altrimenti sarebbe inutilizzabile, ma non riesco a trovare dove lo richiede lo standard. Hai un riferimento? –

3

-0,0 == 0,0 in base alle doppie regole di confronto.

Per valori non finiti (+ -Inf, Nan) somefloat * 0.0! = 0.0.

+1

'NaN' come valore finito è un po 'strano. L'OP chiede informazioni sul valore finito. – nhahtdh

+0

Semplicemente raffinato. NAN non si verifica nel mio scenario specifico – Martin

+0

Cosa intendi con "per valori non finiti (+ -Inf, Nan) somefloat * 0.0! = 0.0." ? Questo sembra un po 'confuso o è solo la formattazione – Martin

1

Il tuo assert non può mai fallire, purché somefloat non sia infinito o NaN. Sui sistemi che non supportano infinito o NaN, il compilatore può semplicemente ottimizzarlo.