Come faccio a fare riferimento al più piccolo valore non zero possibile?

2

Tornando ai miei giorni di programmazione C pensavo che ci fosse una costante o una funzione (non riesco a ricordare come si chiamava, chiamiamola SMALL ) il cui valore era il più piccolo valore positivo possibile. (Immagina il LSB = 1 e tutti gli altri bit = 0.) È stato usato per evitare un errore di divisione per zero.

Ad esempio, supponiamo di voler calcolare z = x/y . Quindi potresti calcolare z = x / (y + SMALL);

Esiste una funzione incorporata in MS EXCEL che implementa SMALL ? Del resto, esiste in C / C ++ o sto diventando pazzo?

    
posta Stainsor 23.02.2012 - 17:42
fonte

4 risposte

4

Dai un'occhiata al link il FLT_EPSILON può essere usato per confrontare una variabile flottante a 0 (zero) , o quasi zero in questo caso.

C'è un altro articolo qui: link

EDIT: quello che ti serve è questo q & a: link descrive il valore epsilon in excel.

    
risposta data 23.02.2012 - 17:58
fonte
7

Penso che probabilmente stai ricordando FLT_EPSILON , DBL_EPSILON e così via.

Non sono abbastanza ciò che stai descrivendo però: non sono il numero più piccolo maggiore di 0. Piuttosto, sono il numero più piccolo maggiore di 1. Nel bene o nel male, tuttavia, DBL_EPSILON-1 non sarà nemmeno vicino al numero più piccolo maggiore di 0. Epsilon è realmente concepito per essere ridimensionato per moltiplicazione, non per addizione o sottrazione.

Questo non è normalmente usato per evitare problemi con la divisione per zero, ma per dare un'idea della minima differenza possibile tra due numeri, e se due numeri sono "sostanzialmente diversi", o qualsiasi disuguaglianza tra loro è in realtà dovuta all'arrotondamento errori (e tali).

Vorrei anche notare che sostituire x/y con x/(y+EPSILON) potrebbe facilmente causare una divisione per zero invece di prevenirlo (cioè, se y == -EPSILON ).

    
risposta data 23.02.2012 - 18:19
fonte
4

Il modo corretto di C ++ è nell'intestazione <limits> :

in particolare std::numeric_limits<T>::epsilon() è definito (specializzato) per tutti i tipi built-in come in cppreference

    
risposta data 23.02.2012 - 18:48
fonte
1

Come dice @Rythal, è un modo terribile di evitare la divisione per zero, tuttavia, se si desidera persistere, i valori minimi (e massimi) per float e double sono definiti in float.h. Questo è esplorato qui .

    
risposta data 23.02.2012 - 18:06
fonte

Leggi altre domande sui tag