Thread View: pl.comp.lang.perl
4 messages
4 total messages
Started by Maciej Misiak
Wed, 19 Jan 2011 21:43
niedokładność biginta
Author: Maciej Misiak
Date: Wed, 19 Jan 2011 21:43
Date: Wed, 19 Jan 2011 21:43
23 lines
1404 bytes
1404 bytes
Help. #!perl -l use bigint; ($x,$y)=split/ /, "26315789473684210 5"; ($l,$m)=($y.$x,$x.$y); $xx=$l/$m; print$l,' ', $m,' ',$xx, ' ', $xx*$m, ' ', $xx*$m-$l; die if $xx*$m!=$l; Ja mam w wyniku die, choć nie powinienem: 526315789473684210 263157894736842105 2 5.26315789473684e+017 64 Died at p168test.pl line 9. Win XP, perl 5.10 Czy to jest kwestia starego softu, czy też ja czegoś nie doczytałem o precyzjach? Większe liczby liczone są dobrze o dziwo :( -- grizzley
Re: niedokładność biginta
Author: Stachu 'Dozzie' K.
Date: Wed, 19 Jan 2011 22:11
Date: Wed, 19 Jan 2011 22:11
100 lines
3197 bytes
3197 bytes
On 2011-01-19, Maciej Misiak <grizzley@poczta.onet.pl> wrote:
> Help.
>
> #!perl -l
>
> use bigint;
>
> ($x,$y)=split/ /, "26315789473684210 5";
> ($l,$m)=($y.$x,$x.$y);
> $xx=$l/$m;
> print$l,' ', $m,' ',$xx, ' ', $xx*$m, ' ', $xx*$m-$l;
> die if $xx*$m!=$l;
>
>
> Ja mam w wyniku die, choć nie powinienem:
> 526315789473684210 263157894736842105 2 5.26315789473684e+017 64
> Died at p168test.pl line 9.
No też bym się czegoś innego spodziewał. Przepisałem twój skrypt na
nieco bardziej widoczny:
#v+
#!perl -l
use bigint;
my ($x, $y) = split / /, "26315789473684210 5";
my ($l, $m) = ($y . $x, $x . $y);
print "L = ", $l;
print "M = ", $m;
my $xx = $l / $m;
print "F (= L/M) = ", $xx;
print "F * M = ", $xx * $m;
print "F * M - L (=~ 0) = ", $xx * $m - $l;
#v-
Output:
#v+
L = 526315789473684210
M = 263157894736842105
F (= L/M) = 2
F * M = 5.26315789473684e+17
F * M - L (=~ 0) = 64
#v-
Czyli z jakiegoś powodu "$xx * $m" jest zamieniane na floating point.
#v+
print "F * M = ", Math::BigInt->bmul($xx, $m);
print "F * M - L (=~ 0) = ", Math::BigInt->bmul($xx, $m) - $l;
#v-
To odpowiednio wypisuje:
#v+
F * M = 526315789473684210
F * M - L (=~ 0) = 0
#v-
Strzał prawie w ciemno: a na pewno $l i $m są typu Math::BigInt?
#v+
#!perl -l
use bigint;
my ($x, $y) = split / /, "26315789473684210 5";
my ($l, $m) = ($y . $x, $x . $y);
print $l->isa("Math::BigInt");
print $m->isa("Math::BigInt");
#v-
Bingo!
#v+
Can't call method "isa" without a package or object reference at ./test.pl line 8.
#v-
Znaczy: póki $l i $m są stringami, nie mogą być podmiotem operacji,
które wykonuje `use bigint'. Zamiana $l i $m na na-pewno-liczby pomaga:
#v+
#!perl -l
use bigint;
my ($x, $y) = split / /, "26315789473684210 5";
my ($l, $m) = ($y . $x, $x . $y);
$l += 0;
$m += 0;
my $xx = $l / $m;
die if $xx * $m != $l;
print "równe!";
#v-
--
Secunia non olet.
Stanislaw Klekot
Re: niedokładność biginta
Author: Maciej Misiak
Date: Wed, 19 Jan 2011 22:31
Date: Wed, 19 Jan 2011 22:31
45 lines
2341 bytes
2341 bytes
W dniu 2011-01-19 23:11, Stachu 'Dozzie' K. pisze: > On 2011-01-19, Maciej Misiak<grizzley@poczta.onet.pl> wrote: >> Help. >> >> #!perl -l >> >> use bigint; >> >> ($x,$y)=split/ /, "26315789473684210 5"; >> ($l,$m)=($y.$x,$x.$y); >> $xx=$l/$m; >> print$l,' ', $m,' ',$xx, ' ', $xx*$m, ' ', $xx*$m-$l; >> die if $xx*$m!=$l; >> >> >> Ja mam w wyniku die, choć nie powinienem: >> 526315789473684210 263157894736842105 2 5.26315789473684e+017 64 >> Died at p168test.pl line 9. > > No też bym się czegoś innego spodziewał. Przepisałem twój skrypt na > nieco bardziej widoczny: > <....> > > Bingo! > > #v+ > Can't call method "isa" without a package or object reference at ./test.pl line 8. > #v- > > Znaczy: póki $l i $m są stringami, nie mogą być podmiotem operacji, > które wykonuje `use bigint'. Zamiana $l i $m na na-pewno-liczby pomaga: Ach zbawco! Jednak pójdę spać spokojny, że to nie wina Perla :) Z drugiej strony poburczeć sobie trochę poburczę, bo to bez sensu, że wszystkie operacje się zachowują jak przy zwykłych intach, a jedna jedyna konwersja ze stringa nie :/ (chyba, że źle interpretuję miejsce "błędu") Co ciekawe, wystarczyło skonwertować na siłę tylko licznik albo mianownik, niekoniecznie oba. Dzięki za analizę! -- grizzley
Re: niedokładność biginta
Author: Stachu 'Dozzie' K.
Date: Wed, 19 Jan 2011 22:40
Date: Wed, 19 Jan 2011 22:40
13 lines
1636 bytes
1636 bytes
On 2011-01-19, Maciej Misiak <grizzley@poczta.onet.pl> wrote: > Ach zbawco! Jednak pójdę spać spokojny, że to nie wina Perla :) [...] > Co ciekawe, wystarczyło skonwertować na siłę tylko licznik albo > mianownik, niekoniecznie oba. > > Dzięki za analizę! Jak to mówią, co dwie głowy to nie kapusta ;) -- Secunia non olet. Stanislaw Klekot
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads