Java floating point and StrictMath improvement?
Raffaello Giulietti
raffaello.giulietti at gmail.com
Wed Mar 16 09:56:22 UTC 2022
"Computer scientists of the world, unite!
Let's get rid of binary floating-point arithmetic in Java, after 27
years of honorable service!
Let's adopt decimal floating-point arithmetic, where 1 / 3 + 1 / 3 is
still different from 2 / 3, but who cares? At least we have 0.1 * 0.1 =
0.01, as Mathematics commands!"
Just kidding...
More seriously, let's stop this useless discussion.
Raffaello
On 2022-03-16 06:47, A Z wrote:
> To core-libs-dev at openjdk.java.net,
>
>
> float and double should be mutually enhanced or
>
> defaultedly changed, to uphold the following three
>
> properties:
>
>
> 1) Base ten arithmetic on float and double, via operators.
>
> 2) Base Ten elementary function calls, like
>
> those made on java.lang.StrictMath,
>
> on double or float values.
>
> 3) Base ten Comparison operators. ==, !=, >, <, >=,<=.
>
>
>
> Martin has said:
>
>
> 'It is inherently, mathematically *impossible* to emulate decimal
>
> behaviour with binary IEEE 754 arithmetic. That's why Java also
>
> offers java.math.BigDecimal, a decimal floating-point library
>
> implemented in software.'
>
>
> Then don't use IEEE 754 alone! Or, have a dual mode, with an
>
> active alternative. There are binary alternatives, particularly
>
> that include the likes of SSE, that in fact can.
>
>
> The only standards necessary, and really, the 'authoritative standard',
>
> are those prevalent in mathematics itself. Base 10 arithmetic, algebra,
>
> elementary functions, range limited real values.
>
>
> BigDecimal, BigInteger, and https://github.com/eobermuhlner big-math,
>
> with its calculator class, take up more room in memory than necessary.
>
> They are slower, and they do not allow for the use of operators.
>
> Worse yet, they are not immediately reified in the rest of the language,
>
> ie all class and interface libraries.
>
>
> Raffaello has said:
>
> 'Exact representation of 0.1 using base 2 is mathematically impossible,
>
> no matter the language (it is a periodic number in base 2).'
>
>
> Consideration of the article:
>
> https://people.eecs.berkeley.edu/~wkahan/JAVAhurt.pdf
>
>
> Which is admittedly older, but still accurate, indicates otherwise.
>
>
> I contend that within an upper and lower range, that it is possible.
>
> While C++ can't use the immediate ==, !=, >,<,>=,<= operators
>
> immediately accurately, Java has.
>
>
> Using 32 or 64 bit buffers, and an SSE or similar buffer, and the
>
> right algorithms, unto limited range, you can have as much of
>
> a range representation as required for float or double, even
>
> though you ultimately don't have 'exact' representation.
>
>
> Bernd Eckenfels has said:
>
> 'The need to round floating point numbers for commercial math
>
> (and the risk involved in doing so) is nothing new, it predates
>
> the IEEE standard and should be subject for even basic comp
>
> sci curriculums all over the world.'
>
>
> That is true, but it is the case that range termination
>
> of decimal values, by means of truncation, is more accurate
>
> than this. By any processing of rounding, you start gaining
>
> inaccuracy, which can grow and grow and overpopulate the
>
> entire number. In Computer Programming, you can need range
>
> continuous range accuracy. Such as with 2D and 3D processing.
>
> The present Java approach is slower and a waste of memory.
>
>
> Given all this, and given that humans, and representations
>
> of the real world rely on base 10 first, shouldn't the 3
>
> properties I outlined at the beginning of my post be
>
> at least mutually, compatibly, instituted in Java,
>
> if not defaultedly?
>
More information about the core-libs-dev
mailing list