
числа
Интересно удостовериться как обрабатываются несколько минусов-плюсов подряд.
| | #!/usr/bin/perl6
my $num=4 + -5;
$num.say; | | -1 |
Sic... А если так:| | #!/usr/bin/perl6
# my $num=4 + --5; # приводит к ошибке. компиллятор считает
# что надо сделать декремент пятерке, а она read only
my $num=4 + -(-5);
$num.say; | | 9 |
Хм. А без пробелов?| | #!/usr/bin/perl6
my $num=4+-5;
$num.say;
$num=4+-(-5);
$num.say; | | -1
9 |
Без неожиданностей. А если немного позапутывать код?| | #!/usr/bin/perl6
my ($a,$b)=40,55;
# my $c=$a+++++$b; # error, "Cannot modify readonly value"
my $c=$a++ + ++$b;
"$a $b $c".say; | | 41 56 96 |
96 это 40 + 56, это понятно. Жаль, что нельзя поставить пять плюсов. Было бы красиво... Ну и напоследок проверим:| | #!/usr/bin/perl6
my $a=100;
my $b=$a+++-5;
"$a $b".say; | | 101 95 |
N.B. Не надо жадничать пробелы. # mutatio postrema: 22 Jan 2011
Сколько будет знаков, если разделить 1 на 3?
| | #!/usr/bin/perl6
say 1/3; | | 0.333333333333333 |
После точки - 15. А если до точки будет больше знаков?| | #!/usr/bin/perl6
say 31/3;
say 3001/3;
say 312345664518240952/3; | | 10.3333333333333
1000.33333333333
1.0411522150608e+17 |
Понятно. # mutatio postrema: 24 Oct 2011
Сколько будет знаков, если разделить 1 на 0?
| | #!/usr/bin/perl6
(1/0).say; | | Inf |
Вот это на самом деле круто. В каком-то смысле математика - это наука о бесконечном, а оперировать этой бесконечностью раньше было непонятно как. Теперь Inf вроде бы - полноправное число, наравне с 0, 5.3 или даже 17.| | #!/usr/bin/perl6
my $num=Inf;
$num.say;
say $num-10;
say $num+20;
say $num+$num;
$num.sin.say;
if $num > 100500 { 'major'.say } | | Inf
Inf
Inf
Inf
NaN
major |
Очевидно, имеется минус бесконечность.| | #!/usr/bin/perl6
my $num=-Inf;
$num.say;
say $num-10;
say $num+20;
say $num+$num;
$num.sin.say;
if $num < -100500 { 'minor'.say } | | -Inf
-Inf
-Inf
-Inf
NaN
minor |
Ну и самое интересное - действия с несколькими бесконечностями.| | #!/usr/bin/perl6
say Inf+(-Inf);
say Inf/Inf;
say Inf*Inf;
say Inf+Inf+(-Inf);
say 0/Inf;
say 2**Inf; | | NaN
NaN
Inf
NaN
0
Inf |
Возможно, с помощью каких-нибудь прагм можно вернуть стандартное "Illegal division by zero", но очевидно же, что использование бесконечности может сделать процесс программирования еще гибче и интереснее.| | #!/usr/bin/perl6
my $x; my $y=10;
while -1 < $x < Inf {
$y--;
$x=1/$y;
$x.say;
} | | 0.111111111111111
0.125
0.142857142857143
0.166666666666667
0.2
0.25
0.333333333333333
0.5
1
Inf |
Если нас пугает возможность получения бесконечного значения, то можно устроить обычную проверку, используя Inf как число. Предположим, что на нашей латифундии зарплата рабов зависит от выброса двух игральных костей...| | #!/usr/bin/perl6
# "IC. Tabulator" - все права защищены.
my $i;
loop { $i++;
my $alea_unus=6.rand.ceiling;
my $alea_duo=6.rand.ceiling;
my $denarii=(3600/($alea_unus-$alea_duo)).floor;
"$alea_unus $alea_duo Servus $i meruit $denarii denarios".say;
last if $denarii == Inf;
}
say "Servus {$i+1} et ceteri denarios non ceperit\n"; | | 3 4 Servus 1 meruit -3600 denarios
3 4 Servus 2 meruit -3600 denarios
1 6 Servus 3 meruit -720 denarios
4 3 Servus 4 meruit 3600 denarios
5 4 Servus 5 meruit 3600 denarios
2 1 Servus 6 meruit 3600 denarios
6 4 Servus 7 meruit 1800 denarios
2 6 Servus 8 meruit -900 denarios
5 6 Servus 9 meruit -3600 denarios
3 4 Servus 10 meruit -3600 denarios
1 5 Servus 11 meruit -900 denarios
1 5 Servus 12 meruit -900 denarios
4 4 Servus 13 meruit Inf denarios
Servus 14 et ceteri denarios non ceperit
|
Аналогично можно писать что-то вроде: if $denarii == NaN (то есть если зарплата носит не количественный, а качественный характер). # mutatio postrema: 23 Oct 2011
|