ho un successivo C espressione (variabili sono galleggianti 32-bit)virgola mobile zero implementazioni C (IEEE 754 invarianti?)
float result = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
Supponendo che x0==x1
e y0==y1
, (e con ==
intendo binario identità di rappresentazione), posso contare sul fatto che l'espressione sarà necessariamente valutata a zero (come in, tutti i bit del float sono impostati su 0)? In altre parole, posso supporre che i seguenti invarianti siano sempre validi?
memcmp(&a, &b, sizeof(float) == 0 => memcmp(a-b, (uint32_t)0, sizeof(float)) == 0
0*a == 0.0
È sicuro assumere che tutti i valori sono numeri finiti (non INFINITY o NaN).
Modifica: come indicato nelle risposte, le moltiplicazioni con 0 possono produrre zeri firmati. Posso ancora fare affidamento sul fatto che il risultato dell'espressione sarà pari a 0,0 utilizzando le regole FP-confronto, cioè .:
(result == 0.0)
Edit 1: Sostituito tipo getta da memcmp chiama a illustrare la domanda migliore.
P.S. Sto limitando il mio codice solo ai compilatori C11 compatibili, nel caso in cui faccia qualche differenza. Sono anche disposto a fare affidamento sul supporto STDC_IEC_559 se ciò sarà d'aiuto per il mio caso.
Possiamo assumere anche che 'y2 - y0' e' x2 - x0' saranno finiti? –
@OliverCharlesworth: sì. Se non è così, sono d'accordo con i risultati non definiti. – MrMobster
Quali tipi sono 'a' e' b'? Se non sono 'uint32_t', il tuo codice richiama il comportamento non definito (violazione della regola del tipo effettiva). Quindi tutto è permesso dallo standard.Lo stesso per 'ZERO' – Olaf