Domanda

O c'è una possibilità che l'operazione fallisca?

Grazie.

Ho scelto il termine sbagliato e ciò che intendevo veramente era arrotondare a 0, non troncamento.

Il punto è che devo confrontare la parte intera di due doppi e li sto semplicemente lanciando in int e quindi usando ==, ma, come qualcuno ha sottolineato in una delle mie precedenti domande, questo potrebbe generare un overflow eccezione se il doppio non può rientrare nell'intero.

Quindi la domanda sarebbe 'È corretto usare l'operatore == per confrontare due doppi che sono stati precedentemente arrotondati a 0, o dovrei attenermi al metodo casting to int e prendere una possibile eccezione?

È stato utile?

Soluzione

Ecco il sito aggiornato che discute i pro e i contro di diversi metodi per confrontare i numeri in virgola mobile. (Puoi ancora visualizzare il vecchio sito qui ).

Il metodo che seguirei è l'errore "relativo". metodo. Trova la differenza tra i due numeri, convertila in una percentuale dei numeri e se quella percentuale è sufficientemente piccola, allora hai l'uguaglianza.

Altri suggerimenti

Ancora peggio è che a volte, anche per lo stesso numero esatto, fallirà. Questo perché alcuni compilatori o processori useranno più bit di precisione in un registro CPU che in memoria (ad esempio, MSVC ha 3 diverse opzioni di comportamento in virgola mobile). Pertanto, un valore calcolato di recente potrebbe non avere questi bit troncati e sembrerà disuguale. MAI utilizzare == su float.

Può ancora fallire a causa dei normali problemi con la rappresentazione in virgola mobile. Invece di troncarli, usa un delta che rappresenterebbe la precisione equivalente.

Può fallire nei casi in cui hai due float che normalmente considereresti lo stesso,

  
    

10.19999999

         

10.20000001

  

ma quando li tronchi danno risultati diversi.

  
    

10.19

         

10.20

  

Considerando che, se avessi usato un delta di 0,001 per confrontare la differenza, avrei visto che questi due valori sono effettivamente gli stessi.

Non è mai corretto usare == con virgola mobile.

Che cosa "tronca" quotato intendi in un contesto in virgola mobile? Quale specifica funzione di libreria stai chiamando? Qual'è il risultato? Cosa ti fa credere che "troncato" i valori sono più comparabili dei valori non troncati?

Il virgola mobile è un'approssimazione di valori decimali. Il virgola mobile può rappresentare precisamente solo due potenze. Tutti gli altri valori sono soggetti a errori, indipendentemente dalle operazioni in virgola mobile eseguite.

Se, tuttavia, si converte in numero intero, è possibile utilizzare == .

Se il valore assoluto è inferiore a 2 ^ 23 per singolo o 2 ^ 52 per doppio, è possibile utilizzare round () e quindi fare il confronto. Valori più grandi non possono essere memorizzati con precisione e questo si apre per situazioni in cui N == N + 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top