views:

80

answers:

4

Can anyone shed some light on why Double.MIN_VALUE is not actually the minimum value that Doubles can take?

I understand why it's a useful number, but it seems a very unintuitive name, especially when compared to Integer.MIN_VALUE. Calling it Double.SMALLEST_POSITIVE or MIN_INCREMENT or similar would have clearer semantics.

Also, what is the minimum value that Doubles can take? Is it -Double.MAX_VALUE? The docs don't seem to say.

+1  A: 

The minimum value for a double is Double.NEGATIVE_INFINITY that's why Double.MIN_VALUE isn't really the minimum for a Double.

As the double are floating point numbers, you can only have the biggest number (with a lower precision) or the closest number to 0 (with a great precision).

If you really want a minimal value for a double that isn't infinity then you can use -Double.MAX_VALUE.

Colin Hebert
Following that idea, is the maximum value for a Double Double.MAX_VALUE or Double.POSITIVE_INFINITY?
mo-seph
`Double.MIN_VALUE` could be equal to `Double.NEGATIVE_INFINITY`.
starblue
@starblue, no. @mo-seph, `Double.POSITIVE_INFINITY`, +∞ > everything and —∞ < everything
Colin Hebert
@Colin Hebert, >= and <= to be precise ;-)
aioobe
You probably misunderstood me. In a better world, `Double.MIN_VALUE` would be equal to `Double.NEGATIVE_INFINITY`, because then it would be consistent with `MIN_VALUE` in the integer types. I could initialize any variable for computing a maximum with `MIN_VALUE` and it would be correct. The `Double.MIN_VALUE` we have now would have a better name. (And analogously for `MAX_VALUE`.)
starblue
@mo-seph The maximum is `Double.POSITIVE_INFINITY`.
starblue
@aioobe - Nothing equals infinity, not even infinity. So > and < are fine. ;)
Ishtar
@ishtar, not sure I follow you, `Double.NEGATIVE_INFINITY < Double.NEGATIVE_INFINITY` is false (obviously), but `Double.NEGATIVE_INFINITY <= Double.NEGATIVE_INFINITY` is true (obviously).
aioobe
+1  A: 

Because with floating point numbers, the precision is what is important as there's no exact range.

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

But i agree that it should probably have been named something better :)

John Gardner
OK, but then why does it make sense to have Double.MAX_VALUE? That seems to be clearly defined.
mo-seph
because its the maximum precise value (non infinite), not accounting for its sign.
John Gardner
+3  A: 

The IEEE 754 format has one bit reserved for the sign and the remaining bits representing the magnitude. This means that it is "symmetrical" around origo (as opposed to the Integer values, which have one more negative value). Thus the minimum value is simply the same as the maximum value, with the sign-bit changed, so yes, -Double.MAX_VALUE is the smallest possible actual number you can represent with a double.

I suppose the Double.MAX_VALUE should be seen as maximum magnitude, in which case it actually makes sense to simply write -Double.MAX_VALUE. It also explains why Double.MIN_VALUE is the least positive value.

But sure, I agree that the naming is a bit misleading. Being used to the meaning Integer.MIN_VALUE, I too was a bit surprised when I read that Double.MIN_VALUE was the smallest absolute value that could be represented. Perhaps they thought it was superfluous to have a constant representing the least possible value as it is simply a - away from MAX_VALUE :-)

(Note, there is also Double.NEGATIVE_INFINITY but I'm disregarding from this, as it is to be seen as a "special case" and does not in fact represent any actual number.)

Here is a good text on the subject.

aioobe
+1  A: 

These constants have nothing to do with sign. This makes more sense if you consider a double as a composite of three parts: Sign, Exponent and Mantissa. Double.MIN_VALUE is actually the smallest value Mantissa can assume when the Exponent is at minimun value before a flush to zero occurs. Likewise MAX_VALUE can be understood as the largest value Mantissa can assume when the Exponent is at maximum value before a flush to infinity occurs.

A more descriptive name for these two could be Largest Absolute (add non-zero for verbositiy) and Smallest Absolute value (add non-infinity for verbositiy).

Check out the IEEE 754 (1985) standard for details. There is a revised (2008) version, but that only introduces more formats which aren't even supported by java (strictly speaking java even lacks support for some mandatory features of IEEE 754 1985, like many other high level languages).

Durandal