----- Original Message ----- > From: "A Z" <powerus...@live.com.au> > To: "core-libs-dev" <core-libs-dev@openjdk.java.net> > Sent: Monday, March 14, 2022 7:49:04 AM > Subject: Questions about enhancement and Correction to Java OpenJDK Floating > Point?
Hi Terry, if you want to have the same output as C, instead of println() use printf(). In your example, using out.printf("%f\n", c); prints 0.010000 0.010000 regards, Rémi > To whom it may concern, > > Having noticed > > https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8190947 > https://bugs.openjdk.java.net/browse/JDK-8190991 > > and similar, at > https://community.oracle.com/tech/developers/discussion/4126262/big-issue-with-float-double-java-floating-point > > I have been referred on to the core-libs-dev area. > > The software development company I represent wishes to keep its name > confidential, > and no-mentioned, at this time. > > A number of us at our end have found that floating point and StrictMath > arithmetic > on both float and double does not result in range accuracy, but produces > denormal > and pronormal values. > > We are aware of the Java Language Specification, and IEEE 754 specifications, > to these issues, but are still finding that they are not the most relevant or > great issue. > > While we are aware of the BigDecimal and BigInteger workarounds, and > furthermore, the calculator class including big-math > https://github.com/eobermuhlner, > we are finding in the development, debugging, and editing of our Java > programs, > that using other classes to operate and exchange for the lack of range > accuracy > from float, > double and java.lang.StrictMath, that we are getting bogged down with what > turns > into > more inferior software. The known and available workaround approaches are > becoming > stop-gap measures, perforcedly put in place, while introducing other problems > into OpenJDK or Java software that don't have any particular, immediate, > solutions. > > Substituting float and double data in and out of BigDecimal and BigInteger > produces > source code which is much messier, complicated, error prone, difficult to > understand > and to change, is definitely slower, and is an inferior substitute when float > and double are more than enough in the overwhelming majority of corresponding > cases. > This is particularly showing up in 2D and 3D Graphics software, by the default > OpenJDK Libraries, but also through JMonkeyEngine 3.5. > > Possessing the option to immediately deal with the precondition, postcondition > and field types of float and double is far superior and more than ideal. > All this is before the massive advantage of being able to use operators, > but the change case becomes overwhelming when along a range accurate, > double (or maybe float, also) supporting Scientific Calculator class. > > If I want to discuss (at least OpenJDK) change in this area, I have > been pointed to the core-libs area, by one of the respondents > of the article: > > https://community.oracle.com/tech/developers/discussion/4126262/big-issue-with-float-double-java-floating-point. > > Is there anyone here, at core-libs-dev, who can point > me in a better Oracle or OpenJDK direction, to discuss further > and see about Java float and double and StrictMath floating point > arithmetic denormal and pronormal values being repaired away > and being made range accurate for all evaluation operations > with them? > > Certainly since other languages already have, that are open source > and open resource file ones. 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. > > Consider these three different language API evaluations, > using their equivalents of float and double to perform > the floating point equivalent of that precise evaluation: > > //---------------------------------------------------------- > //The C Language. > #include <stdio.h> > > int main() > { > printf("Program has started..."); > printf("\n"); > printf("\n"); > double a = 0.1D; > double b = 0.1D; > double c = a*b; > printf("%lf",c); > printf("\n"); > printf("\n"); > float d = 0.1F; > float e = 0.1F; > float f = d*e; > printf("%lf",f); > printf("\n"); > printf("\n"); > printf("Program has Finished."); > return 0; > } > > /* > Program has started... > > 0.010000 > > 0.010000 > > Program has Finished. > */ > //---------------------------------------------------------- > //The C++ Language. > > #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. > */ > > //---------------------------------------------------------- > //The Java Language. > > import static java.lang.System.*; > public class Start > { > public static void main(String ... args) > { > out.println("Program has started..."); > double a = 0.1D; > double b = 0.1D; > double c = a*b; > out.println(); > out.println(c); > float d = 0.1F; > float e = 0.1F; > float f = d*e; > out.println(); > out.println(f); out.println(); > out.println("Program has Finished."); > }} > > /* > Program has started... > > 0.010000000000000002 > > 0.010000001 > > Program has Finished.. > */ > //---------------------------------------------------------- > > In order for java to introduce either default alteration, > or a compatibility mode alteration, where, > how and who should I begin to speak with? > > Yours Sincerely, > > Terry Neale