[Moscow.pm] странности округления и srand

Antonio Nikishaev a на lelf.me
Вт Окт 14 09:36:10 PDT 2014


Вычислять/не вычислять тут совершенно не в тему.  Поведение разное из-за
того что то ваше число — большое и последняя цифра в целой части
оказывается последней значещей.

srand научили уметь ругаться на переполнение аргумента, в этот момент
(впрочем я точно не смотрел) скорее всего и изменили механизм его
передачи:

Betty:perl lelf$ perl -E 'say $^V; for my $x (1e13+.9, 1e14+.9) { say "$x"; say int $x; say srand($x); say srand("$x") }'
v5.16.2
10000000000000.9
10000000000000
10000000000000
10000000000000
100000000000001
100000000000000
100000000000000
100000000000001

v5.20.0
10000000000000.9
10000000000000
10000000000000
10000000000000
100000000000001
100000000000000
100000000000001
100000000000001





On 2 Oct 2014, at 14:18, Вадим Власов <scripter.vrn at gmail.com> wrote:

> Ну да, про truncate понятно, не понятно, почему в 5.18 в нашем случае в большую сторону округляет.
> При этом, если явно подставить дробное число, тоже транкейтит, так же как и в 5.14:
> 
> [scripter at dev-vbox:~]$ perl -v | fgrep version && perl -E 'srand(3.9); say rand'
> This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
> 0.783234962103055
> 
> scripter at work-desktop:~$ perl -v | fgrep version && perl -E 'srand(3.9); say rand'
> This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
> 0.783234962103055
> 
> 
> И даже если вычислять аргумент, все равно идентичное поведение:
> 
> [scripter at dev-vbox:~]$ perl -v | fgrep version && perl -E 'srand(7.8/2); say rand'
> This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi
> 0.783234962103055
> 
> scripter at work-desktop:~$ perl -v | fgrep version && perl -E 'srand(7.8/2); say rand'
> This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
> 0.783234962103055
> 
> 
> 2 октября 2014 г., 13:15 пользователь Victor Efimov <victor at vsespb.ru> написал:
> в perldoc
> ==
> Most implementations of srand take an integer and will silently
> truncate decimal numbers. This means srand(42) will usually produce
> the same results as srand(42.1). To be safe, always pass srand an
> integer.
> ==
> 
> p.s. мучался с предсказуемыми последовательностями псевдослучайных
> чисел - советовали другой генератор
> http://perlmonks.org/?node_id=1054438
> 
> 
> 2 октября 2014 г., 13:05 пользователь Вадим Власов
> <scripter.vrn at gmail.com> написал:
> > Привет всем, столкнулись со странным эффектом в 5.18
> >
> > [scripter at dev-vbox:~]$ perl -v | fgrep ver
> > This is perl 5, version 14, subversion 2 (v5.14.2) built for
> > x86_64-linux-gnu-thread-multi
> > [scripter at dev-vbox:~]$ perl -E '$dd = "20141002"; say 0.8 * $dd * $dd + 1.55
> > * $dd + 59.3; say int( 0.8 * $dd * $dd + 1.55 * $dd + 59.3 );'
> > 324528000469816
> > 324528000469815
> > [scripter at dev-vbox:~]$ perl -E '$dd = "20141002"; srand( 0.8 * $dd * $dd +
> > 1.55 * $dd + 59.3 ); say rand()'
> > 0.261590199385868
> > [scripter at dev-vbox:~]$ perl -E '$dd = "20141002"; srand( int(0.8 * $dd * $dd
> > + 1.55 * $dd + 59.3) ); say rand()'
> > 0.261590199385868
> >
> > В 5.14 аргумент srand приводится к целому с отбраыванием дробной части, так
> > же как с int.
> >
> >
> > scripter at work-desktop:~$ perl -v | fgrep ver
> > This is perl 5, version 18, subversion 2 (v5.18.2) built for
> > x86_64-linux-gnu-thread-multi
> > scripter at work-desktop:~$ perl -E '$dd = "20141002"; say 0.8 * $dd * $dd +
> > 1.55 * $dd + 59.3; say int( 0.8 * $dd * $dd + 1.55 * $dd + 59.3 );'
> > 324528000469816
> > 324528000469815
> > scripter at work-desktop:~$ perl -E '$dd = "20141002"; srand( 0.8 * $dd * $dd +
> > 1.55 * $dd + 59.3 ); say rand()'
> > 0.132392508051456
> > scripter at work-desktop:~$ perl -E '$dd = "20141002"; srand( int(0.8 * $dd *
> > $dd + 1.55 * $dd + 59.3) ); say rand()'
> > 0.261590199385868
> > scripter at work-desktop:~$ perl -E '$dd = "20141002"; srand( int(0.8 * $dd *
> > $dd + 1.55 * $dd + 59.3)+1 ); say rand()'
> > 0.132392508051456
> >
> > А в 5.18 округляется, так же как при выводе. Почему так? Такое поведение
> > описано где-то?
> >
> > --
> >   С уважением,
> >   Вадим Власов
> >   т.: +7 (916) 424-00-72
> >
> > --
> > Moscow.pm mailing list
> > moscow-pm at pm.org | http://moscow.pm.org
> >
> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org
> 
> 
> 
> -- 
>   С уважением,
>   Вадим Власов
>   т.: +7 (916) 424-00-72
> -- 
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org



Подробная информация о списке рассылки Moscow-pm