2014-09-16 16 views
6

Perché 1 == 1 restituisce true e 1.0 == 1.0 restituisce false?Perché "1.0 == 1.0" è falso in Ocaml?

Credo = è strutturale e == è fisico, quindi non dovrebbero entrambi tornare falso?

+1

In particolare, consultare http://stackoverflow.com/a/13596236/2864740 – user2864740

+0

Leggi http://floating-point-gui.de (utile per la lettura in generale, anche se non risponde alla tua domanda) –

risposta

11

Il problema non è con i valori, il problema è con uguaglianza fisico ==. Il suo significato è dipendente dall'implementazione fatta eccezione per alcune garanzie specifiche.

Nella consueta attuazione OCaml, valori galleggianti sono inscatolato, quindi è normale che non esistono due valori di tipo float ad essere fisicamente uguali.

Viceversa, valori int non vengono inscatolati, quindi due valori int uguali saranno uguali fisicamente.

uguaglianza fisica non deve essere utilizzato a meno che non sei molto sicuro di sapere cosa si sta facendo. Viola molte proprietà desiderate di un linguaggio funzionale, come la trasparenza referenziale, come in questo caso.

Aggiornamento: le garanzie specifiche per il significato di == sono fornite da Pierre Chambart nella sua eccellente risposta.

9

La semantica di uguaglianza fisica (==) è:

  • qualsiasi valore x == y vale implica compare x y è 0 (che solitamente i mezzi x = y)
  • sui valori modificabili se x == y vale se e solo se, mutando x interesserà anche y

Questo è tutto, non si presuppone altro. (Vedi {http://caml.inria.fr/pub/docs/manual-ocaml-4.02/libref/Pervasives.html#VAL%28==%29}

Nota che compare x y = 0 non è esattamente equivalente a x = y perché nan non è uguale a niente, compreso se stesso

(tra l'altro dal O'Caml 4.02 un'ottimizzazione rende 1.0 == 1.0 vero in codice nativo, ma non in bytecode)