Talk:Pseudo-random numbers/PCG32: Difference between revisions

m
no edit summary
mNo edit summary
 
(8 intermediate revisions by 2 users not shown)
Line 48:
:::::::: Writing an alternative draft is, of course, the only constructive use of these divergences. I might often feel puzzled by the sheer unreliability and stylistic incoherence of some variants touchingly announced to be 'idiomatic', but these things don't need to be said.
:::::::: Variant drafts are much more useful and interesting Rosetta commentaries, and much more eloquent too. [[User:Hout|Hout]] ([[User talk:Hout|talk]]) 06:57, 16 August 2020 (UTC)
 
== Help needed ==
 
I am trying to translate the JAVA Program to REXX.
 
Can anyone explain this stone in my way (the different values of t5)?
 
These are a few lines of a JAVA program
<pre>
long t1=(shiftedx >>> rotx); System.out.printf("%nt1=%d",t1);
int t2=(~rotx); System.out.printf("%nt2=%d",t2);
int t3=(t2+1); System.out.printf("%nt3=%d",t3);
int t4=(t3 & 31); System.out.printf("%nt4=%d",t4);
System.out.printf("%nshiftedx=%d",shiftedx);
System.out.printf("%nlong t5=(shiftedx << t4);");
long t5=(shiftedx << t4); System.out.printf("%nt5=%d",t5);
long t7=(t1|t5); System.out.printf("%nt7=%d",t7);
int t8=(int) t7; System.out.printf("%nt8=%d",t8);
 
running this program shows this in the output:
 
t4=20
shiftedx=-293022013
long t5=(shiftedx << t4);
t5=1815085056
 
When I try this in a small program,
 
long n=-293022013;
int s=20;
long t5=(n<<s);
System.out.printf("%nn=%d",n);
System.out.printf("%nt5=%d",t5);
I get
n=-293022013
t5=-307255850303488
</pre>
--Walter Pachl 08:22, 27 February 2021 (UTC)
 
::64 bit, n <<s is the bigger number. Try masking to 32-bit such as: (n << s ) & 0xffffffff to keep things 32-bit. --[[User:Wherrera|Wherrera]] ([[User talk:Wherrera|talk]]) 08:37, 27 February 2021 (UTC)
 
:: but there's no masking in the original pprogram --Walter Pachl 09:14, 27 February 2021 (UTC)
 
:: In some languages a long is 32 bits and a long long is 64 bits, so in those making it a long masks it to 32 bits. --[[User:Wherrera|Wherrera]] ([[User talk:Wherrera|talk]]) 17:24, 27 February 2021 (UTC)
 
:::I am only talking and trying to understand Java. long is 64 bits.
 
Can anyone explain on bit level how this result comes about?
<pre>
public class how {
public static void main(String[] args) {
long old=0xCEC0317BC206D20CL;
System.out.printf("%nold=%d",old);
int shifted = (int) (((old >>> 18) ^ old) >>> 27);
System.out.printf("%nshifted=%d",shifted);
}
}
old=-3548782098761985524
shifted=-671065735 ??????????????
</pre>
doing the shif1t 18, the and, and the shift 27 gives me 402944 -:(
 
and was wrong!
 
oops. my fault. I do get -671065735 if I use xor instead of the and!!!!
 
I do hope the end is nigh!
 
--Walter Pachl 20:37, 27 February 2021 (UTC)
 
I just tested this in Java 8 (1.8) and the behavior you got only happens with two ints, and the larger number happens if either is a long. --[[User:Wherrera|Wherrera]] ([[User talk:Wherrera|talk]]) 23:42, 27 February 2021 (UTC)
4,102

edits