Quando confronti i float, come chiami la soglia della differenza?

9

Sto confrontando float in Java in questo momento e la formula più semplice è:

Math.abs(a - b) < THRESHOLD

Quando dai il nome alla variabile per la soglia di differenza, dovresti nominarlo delta o Epsilon ? In particolare, quale dei due è il termine corretto per il valore più piccolo che un numero in virgola mobile può rappresentare?

Il termine linguaggio di programmazione è specifico o è universale tra le lingue?

    
posta NobleUplift 07.08.2013 - 23:40
fonte

5 risposte

18

Epsilon in matematica e ingegneria

In matematica e ingegneria in generale:

  • Delta viene generalmente utilizzato per indicare una differenza , che può essere di qualsiasi dimensione.
  • Epsilon viene generalmente utilizzato per indicare un trascurabile quantità.

e epsilon sembra più appropriato nel tuo caso.

Epsilon in informatica

In informatica, in particolare, il termine epsilon si riferisce anche a espilon macchina che misura la differenza tra 1.0f e il float più piccolo che è strettamente più grande di 1.0f . Questo ultimo numero è 1.00000011920928955078125f per float in Java e può essere calcolato con:

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

La definizione di macchina epsilon è coerente con l'uso generale di epsilon sopra descritto.

Confronto di float

Si noti tuttavia che prima di confrontare i float con "proximity", è necessario avere un'idea della loro scala. Due float molto grandi e apparentemente molto diversi possono essere uguali:

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

E inversamente, potrebbero esserci molti possibili valori fluttuanti (e diversi ordini di grandezza) tra due piccoli galleggianti che differiscono dal solo "epsilon" della macchina. Nell'esempio seguente, ci sono 10.000.000 valori float disponibili tra small e f , ma la loro differenza è ancora ben al di sotto della macchina epsilon:

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

L'articolo collegato nella risposta di GlenH7 indaga ulteriormente il confronto float e propone diverse soluzioni per superare questi problemi.

    
risposta data 07.08.2013 - 23:45
fonte
16

In matematica, delta viene utilizzato per rappresentare alcune differenze rispetto a un valore, epsilon viene utilizzato per rappresentare un valore di errore arbitrario. In questo caso, epsilon sarebbe il nome convenzionale.

    
risposta data 07.08.2013 - 23:53
fonte
8

Per rispondere direttamente alla tua domanda, si desidera utilizzare il termine epsilon . Più precisamente, è machine epsilon , ma l'utilizzo comune elimina "macchina" e utilizza solo epsilon .

Guardando nella mia copia locale di float.h vedo:

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

E i commenti associati chiariscono che epsilon è il termine a cui ti stai riferendo.

Ma possiamo anche fare affidamento su altri riferimenti esterni per verificare che epsilon sia il termine corretto. Vedi qui , qui , qui , e infine questa combinazione di tag di query SO . Non sono riuscito a trovare un riferimento diretto allo standard IEEE 754 per citare.

Non l'hai chiesto, ma ho trovato questo riferimento molto pertinente all'esempio che hai fornito per chiarire la tua domanda.

Dai un'occhiata a questo articolo del blog di Bruce Dawson di Valve sul confronto dei valori in virgola mobile per alcune informazioni sul motivo per cui non desideri utilizzare il confronto suggerito.

C'è un bel po 'di informazioni in questo articolo, ma questo è lo snipppet più pertinente da lì:

If comparing floats for equality is a bad idea then how about checking whether their difference is within some error bounds or epsilon value, like this:

bool isEqual = fabs(f1 – f2) <= epsilon;

With this calculation we can express the concept of two floats being close enough that we want to consider them to be equal. But what value should we use for epsilon?
Given our experimentation above we might be tempted to use the error in our sum, which was about 1.19e-7f. In fact, there’s even a define in float.h with that exact value, and it’s called FLT_EPSILON.
Clearly that’s it. The header file gods have spoken and FLT_EPSILON is the one true epsilon!
Except that that is rubbish. For numbers between 1.0 and 2.0 FLT_EPSILON represents the difference between adjacent floats. For numbers smaller than 1.0 an epsilon of FLT_EPSILON quickly becomes too large, and with small enough numbers FLT_EPSILON may be bigger than the numbers you are comparing!

Dawson ripercorre parecchie altre considerazioni sulle complessità coinvolte nel confrontare i float e nel trattare valori molto piccoli come questo, quindi incoraggerei la tua lettura del resto del suo post.

    
risposta data 08.08.2013 - 20:37
fonte
5

Questa è una funzione di errore; l'errore assoluto viene solitamente chiamato ε (epsilon) o Δ x per una certa quantità x:

ε = |expected − actual|

Δx = |x0x |

L'errore relativo viene talvolta chiamato η (eta):

η = |1 − actual/expected|

Ai fini della programmazione, absoluteError e relativeError (o alcune abbreviazioni) sono più descrittivi. Se vuoi affermare che l'errore è inferiore a un certo valore, quel valore sarebbe semplicemente chiamato soglia o tolleranza .

See:

risposta data 08.08.2013 - 20:43
fonte
3

Lo chiamerei "tolleranza".

Forse non è il termine matematicamente corretto, ma il semplice fatto che tu mi chieda la domanda implica che né "delta" né "epsilon" sarebbero un buon nome di variabile da usare.

Secondo la mia esperienza, è meglio usare nomi di identificatori che abbiano senso per coloro che leggeranno effettivamente il codice. A che serve un nome perfettamente corretto se questo significa che il lettore deve cercarlo su Wikipedia per capire cosa significa?

    
risposta data 08.08.2013 - 16:59
fonte

Leggi altre domande sui tag