2012-03-17 23 views

Respuesta

3

valor mínimo de float en java es positivo ¿por qué?

Por qué eligieron nombrar las constantes como que no se pueden responder (por nosotros) porque nadie en SO estaba en la sala cuando se tomó la decisión.

Además, conocer la respuesta a la pregunta no va a ayudar, porque los valores de Float.MIN_VALUE y Double.MIN_VALUE no se modificarán, por muy "incorrectos" que sean. (Rompe cualquier código existente que use estas constantes, y los diseñadores de Java solo lo hacen cuando no existe otra alternativa viable. Dejarlo solo es claramente una alternativa viable.)

Supongo que la respuesta (es decir, la verdadera) motivo de la decisión) podría ser relevante para las personas que desarrollan nuevos lenguajes de programación. Sin embargo, van a tener que tomar una decisión de todos modos. FWIW, no lo habría diseñado de esta manera, pero eso no es relevante.

+0

+1 para señalar que la pregunta requiere imposibilidad de obtener rumores. – Mikhail

+0

realmente no se puede decir que nadie estaba aquí cuando se tomó la decisión :) (no yo de todos modos) – rupps

+0

Sin embargo, dado que era una habitación bastante pequeña, y las personas que estaban allí ahora serían bastante mayores ... o retirado ... o ... creo que podemos estar bastante seguros. (¿Alguna vez has visto a James Gosling respondiendo preguntas en StackOverflow?) –

25

MIN_VALUE le dice qué tan preciso puede llegar un flotador, pero no el mínimo matemático que puede representar. Deberían haberlo nombrado mejor ...

Negativo de MAX_VALUE es el valor mínimo matemático para los flotadores (lo mismo vale para el doble).

La razón se puede asumir que esto tiene que ver con cómo los números se representan en binario:

Java flotador y dobles usan bit de signo para representar valores negativos/positivos en contraposición a la representación de complemento a dos para los números enteros. Esto significa que su valor positivo y negativo tienen la misma magnitud, es decir. - (positivo máximo) = negativo máximo Por lo tanto, no es necesario definir una constante mínima matemática real para flotantes porque puede usar la constante máxima positiva para determinar cuál es el límite negativo. Para enteros, necesita 2 constantes diferentes que definan max/min debido a la forma en que representan en binario, es decir, -max! = Min.

Para obtener más información http://people.uncw.edu/tompkinsj/133/numbers/Reals.htm

+0

Esto no explica la nulidad de nombres, que es el verdadero punto de la pregunta. –

+0

Buen punto, eso es bastante contrario a la intuición ... Supongo que deberían haberlo llamado PRECISIÓN o algo ... editado mi respuesta –

13

MIN_VALUE debería llamarse EPSILON es el valor más pequeño de un flotador algo positivo puede representar.

Como un flotador usa la codificación de magnitud de signo, el valor más bajo que un flotador puede representar es -MAX_VALUE.

2

Una posible explicación podría ser que Java sólo se utiliza la misma convención de nomenclatura como C++, que de nuevo heredó los nombres de C.

Java fue influenciado por C++, que comparte el mismo patrón de nomenclatura confuso. En C++, la analogía de Float.MIN_VALUE es std::numeric_limits<T>::min(), que se define como:

valor finito mínimo. Para tipos flotantes con desnormalización (número variable de bits de exponente): valor positivo normalizado mínimo.

En C++ que es una fuente potencial de errores en código de la plantilla, por lo que más adelante en C++ 11, añadieron std::numeric_limits<T>::lowest(), que se define como:

valor finito mínimo. (desde C++ 11) Para tipos integrales: lo mismo que min(). Para tipos de coma flotante: depende de la implementación; en general, el negativo de max().

Pero C++ no era el primer idioma. Todo vuelve a C, que define FLT_MIN el valor mínimo de coma flotante.

Entonces, ¿por qué C eligió definir los mínimos de los números de coma flotante y los enteros de forma inconsistente?

No estoy seguro, pero podría tener que ver con la simetría (ver this answer). Para carrozas, puede usar -FLT_MAX (o -Float.MAX_VALUE). Para enteros, negar el valor máximo no es portátil. De hecho, generalmente es incorrecto en todas las arquitecturas modernas (donde debe mantenerse el -INT_MAX == INT_MIN + 1).

Cuestiones relacionadas