Thanks all.  I'm not using DoubleSummaryStatistics or any JNI.

One thing I noticed when I was logging my calcs, trying to compare the 
differences between Java and JavaScript, I would sometimes get -0.0 for a 
double.

Turns out there is a difference between 0.0 and -0.0, but (I think) only 
when using Double, not double (which I have in a few places).  Ie:

*In Java:*
Double a = 0.0;
Double b = -0.0;

if (a == b) System.out.println("yes");
else System.out.println("no");

Prints "no".

*While in GWT:*
Double a = 0.0;
Double b = -0.0;

if (a == b) GWT.log("yes");
else GWT.log("no");

Prints "yes".

I'll now remove all "Double"s from my code and see if that fixes it.  
Fingers crossed!

On Tuesday, 13 May 2025 at 5:13:31 am UTC+10 Colin Alworth wrote:

> Any chance you're using any JNI libraries in your JVM implementation? I 
> recently became aware that gcc-compiled libraries with -ffast-math and 
> friends can result in subnormal values doing unexpected things, causing 
> inconsistent/incorrect results for some well defined operations. 
> Unfortunately that flag can cause gcc to emit x86 assembly that makes 
> global changes to how a process interacts with these numbers.
>
>
> https://moyix.blogspot.com/2022/09/someones-been-messing-with-my-subnormals.html
>
> It appears that Java 22+ has mitigation for this, by testing in at least 
> some cases if these features have been used and then attempting to restore 
> the expected state for Java:
>
> https://github.com/openjdk/jdk/commit/df599dbb9b0f0ee96d1ec767ac8821f164ab075d
> https://bugs.openjdk.org/browse/JDK-8295159
>
> My read is that this is technically incomplete, since it only happens at 
> loadLibrary() time, and technically any call into JNI could re-set these 
> flags.
> On Monday, May 12, 2025 at 10:50:08 AM UTC-5 Jens wrote:
>
>> It is really weird that your results do not match. Prior Java 17 the 
>> "strictfp" keyword could be used to force the JVM to not cheat a little. 
>> But since Java 17 it is the default and the keyword does nothing anymore (
>> https://openjdk.org/jeps/306). So the results should be portable now.
>>
>> In case you are using DoubleSummaryStatistics in your code, GWT emulation 
>> uses Kahan summation to compensate for rounding errors but I think Java 
>> uses the same algorithm. However JavaDoc of 
>> DoubleSummaryStatistics.getSum() leaves room to have different 
>> implementations and error compensations. It explicitly says that the output 
>> may vary for the same input.
>>
>> -- J.
>>
>> Craig Mitchell schrieb am Montag, 12. Mai 2025 um 15:45:15 UTC+2:
>>
>>> The results from GWTTestCase match JavaScript!
>>>
>>> It's rather slow though.  Running the same test in these envs:
>>>
>>>    - Java: 184ms.
>>>    - JavaScript (Chrome): 3.5 seconds.
>>>    - GWTTestCase: 5.8 minutes.
>>>
>>>
>>> On Wednesday, 30 April 2025 at 3:39:57 pm UTC+10 Craig Mitchell wrote:
>>>
>>>> > *I meant that IntelliJ run configuration for JUnit has an option 
>>>> forkmode and I am pretty sure the maven plugin also has an option for JVM 
>>>> forking. For example you can configure that every test method should run 
>>>> in 
>>>> a forked VM in IntelliJ. By default it doesn't do that. *
>>>>
>>>> Ah, cool, thanks.  I see that option now.
>>>>
>>>> [image: download.png]
>>>>
>>>> With it on, I get different results again.  Different to maven, 
>>>> different to no fork, and different to JavaScript.
>>>>
>>>> And if I run it through Maven with "mvn test -DforkCount=1 
>>>> -DreuseForks=false", I get results that are completely different again.
>>>>
>>>> They are still consistent though.  Ie: Running it multiple times, 
>>>> always gets the same results.
>>>>
>>>> On Tuesday, 29 April 2025 at 8:34:25 pm UTC+10 Jens wrote:
>>>>
>>>>> *> Maybe the result slightly changes if JVM decides to optimize a hot 
>>>>> code path in case the JVM is reused. You might want to check how maven 
>>>>> and 
>>>>> your intellij run configuration are configured in terms of JVM forking.*
>>>>>
>>>>> IntelliJ seems to add the options:
>>>>> -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false 
>>>>> -Ddebugger.agent.enable.coroutines=true 
>>>>> -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true 
>>>>> -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true 
>>>>> -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 
>>>>> -Dsun.stderr.encoding=UTF-8
>>>>>
>>>>> So I added those to MAVEN_OPTS, but it didn't seem to make any 
>>>>> difference.  I also tried adding @NotThreadSafe to my test suite, 
>>>>> again no difference.
>>>>>
>>>>>
>>>>> I meant that IntelliJ run configuration for JUnit has an option 
>>>>> forkmode and I am pretty sure the maven plugin also has an option for JVM 
>>>>> forking. For example you can configure that every test method should run 
>>>>> in 
>>>>> a forked VM in IntelliJ. By default it doesn't do that. 
>>>>>
>>>>> -- J.
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/google-web-toolkit/86394de3-ad5c-4aa0-b20d-c46f7f803b35n%40googlegroups.com.

Reply via email to