Re: [fpc-devel] Different results of random(int32) and random(int64) for negative limit value

2017-05-24 Thread Jonas Maebe

On 24/05/17 09:35, Thaddy de Koning wrote:
The implementation is _*not *_undefined for negative values,_unless you 
say that you define it as undefined_.


That is exactly what "undefined" means: the implementation was not 
designed to handle such values, so whatever you get as a result is 
undefined.



Jonas
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel


Re: [fpc-devel] Different results of random(int32) and random(int64) for negative limit value

2017-05-24 Thread Thaddy de Koning

Jonas, sorry for the late response:

The implementation is _*not *_undefined for negative values,_unless you 
say that you define it as undefined_.


Because you seem to have implemented it or most of it.

It renders a mathematical comparable distribution in the negative to the 
positive values.


In both Turbo Pascal as in Delphi and because they use a different 
algorithm and made an implementation error as well, the negative values 
are indeed not defined. But that's because of the algorithm and because 
of the implementation by Borland (yes, it stems from Borland times).


The Mersenne Twister we use is also valid for negative values and if you 
want I can send you the mathematical proof.


I already made the LCG in Delphi compatible mode available on the wiki 
and that implementation differs in so far as that it corrects the 
"undefined for negative values" for that algorithm too. It is 100% 
compatible for the Delphi documented range, btw.


I am busy evaluating important Random implementions for different 
languages, so an FPC library is available for data that is generated in 
a different language and relies on a particular PRNG.


Also note that the output of the current random is strictly valid for 32 
bit only.


In my code I already added a 64 bit version.

Regards,

Thaddy




On 5/20/2017 2:57 PM, Jonas Maebe wrote:

On 20/05/17 14:36, Martin Schreiber wrote:

Is this intended? If not, which one is correct?


random(x) is undefined for negative parameters. It should have had an 
unsigned parameter, like in Turbo Pascal (where it is word). Delphi 
defines it as always returning a positive value, but I don't know what 
happens if you pass a negative parameter there.



Jonas
___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel


___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel


Re: [fpc-devel] Different results of random(int32) and random(int64) for negative limit value

2017-05-24 Thread Thaddy de Koning
Of course 64 and 32 bit are the sizes, not the platform! That may not be 
clear.



On 5/24/2017 9:35 AM, Thaddy de Koning wrote:


Jonas, sorry for the late response:

The implementation is _*not *_undefined for negative values,_unless 
you say that you define it as undefined_.


Because you seem to have implemented it or most of it.

It renders a mathematical comparable distribution in the negative to 
the positive values.


In both Turbo Pascal as in Delphi and because they use a different 
algorithm and made an implementation error as well, the negative 
values are indeed not defined. But that's because of the algorithm and 
because of the implementation by Borland (yes, it stems from Borland 
times).


The Mersenne Twister we use is also valid for negative values and if 
you want I can send you the mathematical proof.


I already made the LCG in Delphi compatible mode available on the wiki 
and that implementation differs in so far as that it corrects the 
"undefined for negative values" for that algorithm too. It is 100% 
compatible for the Delphi documented range, btw.


I am busy evaluating important Random implementions for different 
languages, so an FPC library is available for data that is generated 
in a different language and relies on a particular PRNG.


Also note that the output of the current random is strictly valid for 
32 bit only.


In my code I already added a 64 bit version.

Regards,

Thaddy




On 5/20/2017 2:57 PM, Jonas Maebe wrote:

On 20/05/17 14:36, Martin Schreiber wrote:

Is this intended? If not, which one is correct?


random(x) is undefined for negative parameters. It should have had an 
unsigned parameter, like in Turbo Pascal (where it is word). Delphi 
defines it as always returning a positive value, but I don't know 
what happens if you pass a negative parameter there.



Jonas
___
fpc-devel maillist  - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel




___
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel