Please stop sending mails marked as urgent to a mailing list, you just make a fool of yourself.
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. (Having said that, automatic precision/rounding for number formats in C++ looks neat) Gruss Bernd -- http://bernd.eckenfels.net ________________________________ Von: core-libs-dev <core-libs-dev-r...@openjdk.java.net> im Auftrag von A Z <powerus...@live.com.au> Gesendet: Dienstag, März 15, 2022 5:24 AM An: core-libs-dev@openjdk.java.net <core-libs-dev@openjdk.java.net> Betreff: Discussion about Java Floating Point? To core-libs-dev@openjdk.java.net, In terms of floating point, it seems there are thus three (3) phenomena that are relevant. 1) Arithmetic on float and double, via operators. 2) Elementary function calls, namely those made from java.lang.StrictMath, as it is, on double values. 3) Comparison operators. ==, !=, >, <, >=,<=. Java floating point successfully has 3) the way required, even though other languages, particularly C++ , do not compare their floats and doubles through those comparison operators. The point at issue is Java although, so Java is satisfactory at point 3). My point of contention is that Java does not have 1) and 2) operating as they should, even though C++ and other languages do, in those two areas, namely C++: Martin has submitted the following: ?The following statement is not entirely true when using finite floating point precision: > (?snip?) It is a mathematical fact that, for > consistent, necessary and even fast term, 10% of 10% must > always precisely be 1%, and by no means anything else." /* #include <iostream> using namespace std; int main() { cout << "Program has started..." << endl; double a = 0.1D; double b = 0.1D; double c = a*b; cout << endl << c << endl << endl; float d = 0.1F; float e = 0.1F; float f = d*e; cout << f << endl << endl; cout << "Program has Finished."; return 0; } */ /* Program has started... 0.01 0.01 Program has Finished. */ This is actually not fully or finally true, including SSE, SSE algorithm logic and further. The included C++ example of mine above here disproves this. Even though I do contextually admit these answers can only work within the range of the involved types, it is still actually the case that 10% of 10% can and always precisely be 1%, within the range of the type used, and by no means anything else. Because of the laws of decimal arithmetic. See https://en.wikipedia.org/wiki/Floating-point_arithmetic and the starting sentence: 'In computing, floating-point arithmetic (FP) is arithmetic using formulaic representation of real numbers as an approximation to support a trade-off betwee range and precision.' However, it simply isn't the case that reduced precision has to exist inside the range, certainly not any more. Rationally, one would have to think, with the present SSE support in ubiquity, and the preimplementation that is possible and already around elsewhere, that this kind of tradeoff in floating point isn't any kind of use or advantage any more. This is part of the issue with Java and the OpenJDK at this time, and I am trying to contend that this should be changed, either at default or in some mutual compatibility mode. The other part is java.lang.StrictMath, since it generates denormal and pronormal values on its own, also. Raffaello has stated: To summarize, Java uses IEEE 754 binary arithmetic as by specification, as do most other languages, including C/C++. It is however fundamentally wrong to use binary floating-point arithmetic to emulate decimal behavior. Also, pay attention to the output routines that convert float and double values to a decimal representation. Usually, C and C++ will have information loss by default, as in your case. What we and others are beginning to need to happen, in detailed Java 2D and 3D (JMonkeyEngine 3.5) projects, and more widely again, is that Java floating point arithmetic and function behaviour, on float and double, within their ranges, do need to perfectly match decimal behaviour. C++ arithmetic, at least, has had no problem using floating point arithmetic, at least, to emulate decimal behaviour. I am trying to prove the opposite to Raffaello's statements, that floating point can and indeed must represent decimal behaviour. Output functions in any language that alter the appearance of the float or double value become irrelevant, because the only relevant factor is the operator behaviour and the innate, representation viewpoint of those float or double values. In contrast to Raffaelo, we assert that Java SE and OpenJDK floating point must be changed so that it upholds base ten (10) arithmetic, algebra,and elementary functions on real value arguments within the ranges of double and/or float. Alongside a calculator class that upholds the same. These are in keeping with the Wikipedia view on floating point arithmetic that I quoted earlier, but more than that, they are in keeping with the standards/specifications of Mathematics, and not just an idea that grew in computer science. I wish to still request that this matter be pursued, despite Java's stance on this matter, in terms of the JRE for a very long time now. While it is the case that JDK-8190991 does exist, and should continue, JDK-8190947 has been too blithely swept away. See: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8190947 The explanation 'Closing this enhancement as will not fix' does nothing to explain why the advantages of floating point repair have been turned away, and in fact, not apprehended specifically in Java. Is there someone who can look deeper into this matter, and implement arithmetic and Calculator class changes for the next release version of SE and OpenJDK?