Why does 0x1p3
equal 8.0
? Why does 0x1e3
equal 483
, whereas 0x1e3d
equals 7741
? It is confusing since 1e3d
equals 1000.0
.
Asked
Active
Viewed 6,296 times
11

The Guy with The Hat
- 10,836
- 8
- 57
- 75

serious
- 271
- 2
- 7
-
@marcog this is part of a way to express floating point numbers, see the JLS: http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.2 – Jesper Dec 28 '10 at 13:53
-
@marcog: that's the exponent marker for a hexadecimal floating point literal, as defined in the Java and C99 standards. – Stephen Canon Dec 29 '10 at 23:20
2 Answers
10
0x1e3
and 0x1e3d
are hexadecimal integer literals. Note that e
and d
are hexadecimal digits, not the exponent indicator or double
type indicator in this case.
1e3d
is a decimal floating-point literal. The e
is the exponent indicator, the d
says that this is a double
rather than a float
.
The notation 0x1p3
is a way to express a floating-point literal in hexadecimal, as you can read in section 3.10.2 of the Java Language Specification. It means 1 times 2 to the power 3; the exponent is binary (so, it's 2-to-the-power instead of 10-to-the-power).
-
But 0x1p3 should be as same as 1e3 in this case, right? But they are not. – serious Dec 28 '10 at 14:02
-
@serious No, because the exponent is binary, not decimal. Its 2^3 not 10^3. – Jesper Dec 28 '10 at 14:02
-
Btw, is there any reason why it is binary? I mean, why it is not base of 16? – serious Dec 28 '10 at 14:05
-
Base 16 (hex) is a human construction to help us manage long strings of bits without going mad. In a computer, it's all binary - there's no hex. Note that one binary nybble (4 bits) maps directly to 1 hex digit. So the byte 11010111 becomes (1101)(0111) = 0xD7. – Tony Ennis Dec 28 '10 at 14:24
-
-
-
Sorry, I meant 0x1p3d which contains binary exponent (as mentioned before by Jesper) as opposite to 1e3d with "decimal" exponent. – serious Dec 28 '10 at 14:56
-
I don't know why with the p-notation the exponent is binary. This notation is something that Java inherited from C or C++. It's hard to find out after the fact why someone somewhere long ago thought this would be a useful feature... – Jesper Dec 28 '10 at 15:48
-
@serious, you're getting your terminology and representations mixed up. 1e3d doesn't mean the 3 is in decimal. According to jesper, it means the value is a _double_. If this isn't what you meant, then the confusion might be that the default representation in Java is decimal. So 1e3 is 1000 base 10. 0x1p3 is 8 since the 0x means "this representation is in hex". The reason 'e' is not used for the hex floating point exponent is that it probably leads to an ambiguous situation - 'e' is a valid hex digit, 'p' is not. Thus 'p' is never ambiguous. – Tony Ennis Dec 28 '10 at 16:24
-
Checking the spec linked waaay above, we see that if 'e' were allowed to denote a floating point literal's exponent, then 0x1e3 would be ambiguous. Is it the integer 483 or is it the floating point 8? The (perhaps ham-handed) 'p' removes this ambiguity. – Tony Ennis Dec 28 '10 at 16:31
-
@Jesper: It's an extraordinarily useful feature, whether or not you see a use for it. In particular, it makes it quite easy straightforward to exactly specify a floating point constant without any rounding. – Stephen Canon Dec 29 '10 at 23:23
2
0x1e3 is hex for 483, as is 0x1e3d hex for 7741. The e
is being read as a hex digit with value 14.

moinudin
- 134,091
- 45
- 190
- 216
-
1
-
1@serious, the difference is that 0x1e3 is an integer, not a floating point number. The 'e' in that integer is just an unfortunate coincidence that confuses. 0x1p3 is a floating point number. It is interpreted _very_ differently. The interpretation includes a _mantissa_ and an _exponent_. The former is the 1.0 part (note the assumed decimal point.) The latter is the 'p3' part which which reads 'to the 3rd power.' Since we're in binary, taking a number to to the 3rd power is the same as shifting it 3 bits to the left, so the 0b1 becomes 0b1000. That's 8 in decimal. – Tony Ennis Dec 28 '10 at 14:38