2012-03-17 12 views

risposta

3

valore min del galleggiante in java è positivo perché?

Perché hanno scelto di denominare le costanti come quelle non è possibile (da noi) perché nessuno su SO era nella stanza quando la decisione è stata presa.

Inoltre, conoscere la risposta alla domanda non è di aiuto, perché i valori di Float.MIN_VALUE e Double.MIN_VALUE non saranno modificati, non importa quanto "errati" potrebbero essere. (Romperebbe qualsiasi codice esistente che utilizza queste costanti, e i progettisti Java lo farebbero solo quando non ci sono altre alternative valide. Lasciarlo da solo è chiaramente un'alternativa valida.)

Suppongo che la risposta (cioè il vero motivo della decisione) potrebbe essere essere rilevante per le persone che sviluppano nuovi linguaggi di programmazione. Tuttavia, dovranno comunque decidere autonomamente. FWIW, non l'avrei progettato in questo modo, ma non è rilevante.

+0

+1 per notare che la domanda richiede l'impossibilità di procurarsi dicerie. – Mikhail

+0

non si può davvero dire che nessuno qui era nella stanza quando la decisione è stata presa :) (non me comunque) – rupps

+0

Tuttavia, dato che era una stanza piuttosto piccola, e le persone che erano in esso sarebbe ora piuttosto anziano ... o in pensione ... o ... penso che possiamo essere abbastanza sicuri. (Hai mai visto James Gosling rispondere alle domande su StackOverflow?) –

25

MIN_VALUE indica quanto può essere preciso un galleggiante, ma non il minimo matematico che può rappresentare. Avrebbero dovuto chiamarlo meglio ...

Negativo di MAX_VALUE è il valore minimo matematico per i float (lo stesso vale per il doppio).

La ragione per cui si può assumere questo ha a che fare con il modo i numeri sono rappresentati in binario:

galleggiante Java e doppie usano bit di segno per rappresentare i valori negativi/positivi in ​​contrapposizione alla rappresentazione in complemento a due per gli interi. Ciò significa che il suo valore positivo e negativo hanno la stessa grandezza, cioè. - (positivo massimo) = negativo max. Pertanto non è necessario definire una costante minima matematica effettiva per i float, poiché è sufficiente utilizzare la costante massima positiva per capire quale sia il limite negativo. Per i numeri interi, sono necessarie 2 costanti diverse che definiscono il valore massimo/minimo a causa del modo in cui sono rappresentate in binario, vale a dire -max! = Min.

Per maggiori informazioni http://people.uncw.edu/tompkinsj/133/numbers/Reals.htm

+0

Questo non spiega la denominazione incoerente, che è il vero punto della domanda. –

+0

Buon punto, è piuttosto contro-intuitivo ... Suppongo che avrebbero dovuto chiamarlo PRECISIONE o qualcosa del genere ... ha modificato la mia risposta –

13

MIN_VALUE deve essere denominato EPSILON è il valore più piccolo postive un galleggiante può rappresentare.

Poiché un float utilizza la codifica della magnitudine di segno, il valore più basso che un float può rappresentare è -MAX_VALUE.

2

Una possibile spiegazione potrebbe essere che Java appena usato la stessa convenzione di denominazione come C++, che ancora una volta ha ereditato i nomi da C.

Java è stato influenzato da C++, che condivide lo stesso schema di denominazione di confusione. In C++, l'analogia di Float.MIN_VALUE è std::numeric_limits<T>::min(), che è definito come:

valore minimo finita. Per i tipi floating con denormalizzazione (numero variabile di bit esponenti): valore normalizzato positivo minimo.

In C++ che è una potenziale fonte di bug nel codice del modello, così più tardi in C++ 11, hanno aggiunto std::numeric_limits<T>::lowest(), che è definito come:

Valore minimo finito. (dal C++ 11) Per i tipi interi: lo stesso di min(). Per i tipi a virgola mobile: dipendente dall'implementazione; generalmente, il negativo di max().

Ma il C++ non era la prima lingua. Tutto risale a C, che definisce FLT_MIN il valore in virgola mobile minimo.

Quindi, perché C ha scelto di definire i numeri minimi di numeri in virgola mobile e interi in modo incoerente?

Non sicuro, ma potrebbe avere a che fare con la simmetria (vedere this answer). Per i galleggianti, è possibile utilizzare -FLT_MAX (o -Float.MAX_VALUE). Per i numeri interi, la negazione del valore massimo non è portabile. Di fatto, in genere è sbagliato su tutte le architetture moderne (dove dovrebbe contenere -INT_MAX == INT_MIN + 1).

Problemi correlati