πŸš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
4 messages
4 total messages Started by Bartlomiej Czardybon Tue, 01 Jul 1997 12:33
int ???
#415
Author: Bartlomiej Czardybon
Date: Tue, 01 Jul 1997 12:33
22 lines
879 bytes
Czesc
	
	Jak ktos zgadnie co ten kod wypisze to stawiam piwo, jak mi powie
dlaczego to wypisuje to stawiam piec piw :-))

--
czarnobyl


-----

sub konwertuj {
    $ile=$_[0];
    return int($ile*100);
} 

$ile="19.40";
print $ile*100,"\n";
print konwertuj($ile)."\n";

----
Re: int ???
#416
Author: Piotr Auksztulewicz
Date: Tue, 01 Jul 1997 14:58
78 lines
2492 bytes
Bartlomiej Czardybon (czar@david.silesia.pik-net.pl) wrote:

: Czesc
: 	
: 	Jak ktos zgadnie co ten kod wypisze to stawiam piwo, jak mi powie
: dlaczego to wypisuje to stawiam piec piw :-))

: sub konwertuj {
:     $ile=$_[0];

To jest blad. Powinno byc:

my $ile = $_[0];

Ale w tym przypadku to akurat nie ma znaczenia.

:     return int($ile*100);
: } 

: $ile="19.40";
: print $ile*100,"\n";
: print konwertuj($ile)."\n";

Sprawdzilem, co wypisuje:

1940
1939

Zrobilem to prosciej, zeby sie upewnic, ze nie jest cos nakombinowane
z ta procedura:

perl -e 'print 19.40*100, "\t", int(19.40*100), "\n"'

Efekt ten sam.  Powod: obliczenia zmiennoprzecinkowe. Bynajmniej nie jest
to bug w PA-RISCu (zakladam, ze puszczales to na zeusie).
Generalnie takie cos:

(x*y)/y == x 

(i wiele podobnych) nie zawsze jest prawdziwe dla obliczen
zmiennoprzecinkowych! Akurat miales pecha z tym 19.40. Zrobilem to w C:

#include <stdio.h>
#include <math.h>

main()
{
    double ile = 19.40;
    printf("%f\t%f\n", ile*100.0, floor(ile*100.0));
}

Efekt: 1940.000000     1939.000000
Zrobilem to samo na liczbach o mniejszej precyzji (float) i dostalem:
1939.999962     1939.000000

Wszystko jasne? (piwo tez?)
(Wniosek dodatkowy: perl uzywa podwojnej precyzji...)

PS. Pentium liczy tak samo (puscilem to na Linuxie).
# cat /proc/cpuinfo
processor       : 0
cpu             : 586
model           : Pentium 75+
vendor_id       : GenuineIntel
stepping        : 5
fdiv_bug        : no <--- nie ma buga w procesorze!
hlt_bug         : no
fpu             : yes
fpu_exception   : yes
cpuid           : yes
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8
bogomips        : 39.83


--
Piotr Auksztulewicz                 piotras@zeus.polsl.gliwice.pl
Centrum Komputerowe Politechniki Slaskiej, Gliwice, Akademicka 16
Re: int ???
#417
Author: Bartlomiej Czardybon
Date: Tue, 01 Jul 1997 15:26
51 lines
2047 bytes
Piotr Auksztulewicz <piotras@polsl.gliwice.pl> wrote:
> Bartlomiej Czardybon (czar@david.silesia.pik-net.pl) wrote:

> : Czesc
> : 	
> : 	Jak ktos zgadnie co ten kod wypisze to stawiam piwo, jak mi powie
> : dlaczego to wypisuje to stawiam piec piw :-))

> : sub konwertuj {
> :     $ile=$_[0];
> :     return int($ile*100);
> : } 
> : $ile="19.40";
> : print $ile*100,"\n";
> : print konwertuj($ile)."\n";

> Sprawdzilem, co wypisuje:

> 1940
> 1939

> perl -e 'print 19.40*100, "\t", int(19.40*100), "\n"'

> Efekt ten sam.  Powod: obliczenia zmiennoprzecinkowe. Bynajmniej nie jest
> to bug w PA-RISCu (zakladam, ze puszczales to na zeusie).
> Generalnie takie cos:

> (x*y)/y == x 

	No swietnie... to teraz oglaszam konkurs na procedurke ktora 
bedzie takie cos konwertowala poprawnie... mam jeszcze jedna 
taka liczbe: 1155.60. 
pierwsze podejscie (baaaaardzo glupie i naiwne, ale wykorzystujace
w pelni perla i zdaje sie nie majace szans sie tak wysypac :-))) 
- all flames go to /dev/null ):

sub zl2gr {
        my($ile,$zlotych,$groszy10,$groszy1,$wszystkiego);
        $ile=$_[0];
        $ile=~s/\,/\./g;
        $ile =~ /(.*)\.(.*)/;
        $zlotych=$1;
        $groszy10=substr($2,0,1)*10;
        $groszy1=substr($2,1,1);
        $wszystkiego=$zlotych*100+$groszy10+$groszy1;
        return $wszystkiego;
}


--
czarnobyl
Re: int ???
#418
Author: Michal Mosiewicz
Date: Tue, 01 Jul 1997 23:10
18 lines
1123 bytes
Bartlomiej Czardybon wrote:

>         No swietnie... to teraz oglaszam konkurs na procedurke ktora
> bedzie takie cos konwertowala poprawnie... mam jeszcze jedna
> taka liczbe: 1155.60.

int(1155.60*100 + 0.5)

W ogolnosci: int(x*100 +0.5)

:-) Ile piw?

MichaΕ‚

-- 
********     MEMBER OF THE INTERNATIONAL PROGRAMMERS GUILD    ********
WWW: http://www.lodz.pdi.net/~mimo  tel: Int. Acc. Code + 48 42 148340
add: Michal Mosiewicz  *  Bugaj 66 m.54 *  95-200 Pabianice  *  POLAND
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