Per quale tipo di C ++ incorporato è la legge del mezzo escluso violata?

0

Apparentemente, per alcuni tipi di C ++ incorporati, quanto segue non vale: a==b || a!=b Quale tipo / valore è?

La domanda è originaria di

questo video:

link all'inizio,

per cui le diapositive sono:

link problema 70.

    
posta vetijo 20.07.2017 - 10:10
fonte

3 risposte

6

La risposta è ... non c'è risposta.

C ++, come C, non richiede rappresentazioni particolari per i suoi tipi aritmetici. Gli interi senza segno sono obbligati a seguire l'aritmetica binaria per un certo numero di bit. Ma oltre a questo, viene specificato poco.

I tipi aritmetici sono consentiti (ma non richiesti) per avere le cosiddette "rappresentazioni di trap". Questi sono bit-pattern che rappresentano una condizione errata. Questi violerebbero la regola "escluso centro", poiché i valori trap di solito non sono considerati uguali ad altri valori trap, anche se sono la stessa sequenza di bit.

Ma C ++ non specifica che nessun particolare tipo avrà rappresentazioni di trap. Puoi verificare se un particolare tipo aritmetico intercetta con std::numeric_limits<T>::traps . Ma questa è una limitazione specifica dell'implementazione, non un costrutto definito standard.

    
risposta data 21.07.2017 - 01:40
fonte
3

Non contiene alcuna variabile non inizializzata con un tipo predefinito. Sia a == b che a! = B invocano un comportamento indefinito se a o b non sono inizializzati. "Comportamento indefinito" include la possibilità che sia il confronto sia l'uguale sia il confronto sono diversi (e ovviamente tutte le altre possibili conseguenze).

Il comportamento IEEE 754 è in realtà diverso. Afferma che se un numero è NaN, entrambi i numeri si confrontano ineguali. Anche quando sono uguali. E (+0) e (-0) sono uguali, anche se non sono uguali. Ma (a == b) || (a! = b) rimane vero . Ciò che non è vero per i NaN è (a < b) || (a == b) || (a > b). Tutti e tre sono falsi per i NaN.

    
risposta data 21.07.2017 - 11:51
fonte
0

Ho testato NaN e un == b || a! = b è vero.

#include <math.h>
#include <iostream>
int main(){
        double a = NAN;
        double b = 45.3; // NAN here has same result
        if( (a==b) || (a!=b) ) std::cout << "true\n";
        else std::cout << "false\n";
        return 0;
}
    
risposta data 22.07.2017 - 09:35
fonte

Leggi altre domande sui tag