Números

Los números se representan en punto flotante (doble precisión). Asi pues, en Perl no se distingue entre enteros y flotantes. Perl además, admite el uso de subrayados en las constantes numericas, para hacerlas mas legibles:

$b = 123_456_000_000_000_001;

Aunque en otros lenguajes de programación números y cadenas son cosas bien distintas, en Perl ambos objetos son escalares.

Perl permite trabajar con números en bases octal (comenzando por 0), hexadecimal (0x) y binario (0b). Por ejemplo:

lhp@nereida:~/Lperl/src$ perl -wde 0
Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):   0
  DB<1> p 0377
255
  DB<2> p 0xff
255
  DB<3> p 0b1111_1111
255

Si lo que queremos es hacer la conversión inversa podemos usar sprintf :

lhp@nereida:~/Lbook$ perl -wde 0
main::(-e:1):   0
  DB<1> $num = 42;
  DB<2>   printf("%o", $num);
52
  DB<3> $oct = sprintf("%o", $num);
  DB<4> p $oct
52
Además de los operadores habituales, Perl admite el operador de módulo o resto entero, denotado por % y el operador de exponenciación denotado por **.

Sigue un ejemplo que hace uso del depurador:

$ perl -de 0
main::(-e:1):   0
  DB<1> p 234_512.0*2
469024
  DB<2> p 012
10
  DB<3> p 0b111
7
  DB<4> p 5%2
1
  DB<5> p 5**2
25
  DB<6> p 0x1F
31
 DB<7> p 2/3
0.666666666666667
  DB<8> p (-1)**0.5
nan
  DB<9> p 1/0
Illegal division by zero at (eval 12)...

Ejercicio 1.2.1   ¿Que significa la respuesta nan que da el depurador al cálculo de la raíz cuadrada?

Si se quiere precisión infinita existe un buen número de librerías disponibles. Para cálculo con enteros se puede, ejemplo, usar Math::Pari:

pp2@nereida:~/src/testing$ perl -wde 0
main::(-e:1):   0
  DB<1> use Math::Pari
  DB<2> $a = PARI 2
  DB<3> print $a**10000
19950631168807583848837421626835850838234968318861924548520089498529438830221946
63191996168403619459789933112942320912427155649134941378111759378593209632395785
57300467937945267652465512660598955205500869181933115425086084606181046855090748
66089624888090489894838009253941633257850621568309473902556912388065225096643874
44104675987162698545322286853816169431577562964076283688076073222853509164147618
39563814589694638994108409605362678210646214273333940365255656495306031426802349
69400335934316651459297773279665775606172582031407994198179607378245683762280037
30288548725190083446458145465055792960141483392161573458813925709537976911927780
08269577356744441230620187578363255027283237892707103738028663930314281332414016
24195671690574061419654342324638801248856147305207431992259611796250130992860241
70834080760593232016126849228849625584131284406153673895148711425631511108974551
42033138202029316409575964647560104058458415660720449628670165150619206310041864
22275908670900574606417856951911456055068251250406007519842261898059237118054444
78807290639524254833922198270740447316237676084661303377870603980341319713349365
46227005631699374555082417809728109832913144035718775247685098572769379264332215
99399876886660808368837838027643282775172273657572744784112294389733810861607423
25329197481312019760417828196569747589816453125843413595986278413012818540628347
66490886905210475808826158239619857701224070443305830758690393196046034049731565
83208672105913300903752823415539745394397715257455290510212310947321610753474825
74077527398634829849834075693795564663862187456949927901657210370136443313581721
43117913982229838458473344402709641828510050729277483645505786345011008529878123
89473928699540834346158807043959118985815145779177143619698728131459483783202081
47498217185801138907122825090582681743622057747592141765371568772561490458290499
24610286300815355833081301019876758562343435389554091756234008448875261626435686
48833519463720377293240094456246923254350400678027273837755376406726898636241037
49141096671855705075909810024678988017827192595338128242195402830275940844895501
46766683896979968862416363133763939033734558014076367418777110553842257394991101
86468219696581651485130494222369947714763069155468217682876200362777257723781365
33161119681128079266948188720129864366076855163986053460229787155751794738524636
94469230878942659482170080511203223654962881690357391213683383935917564187338505
10970271613915439590991598154654417336311656936031122249937969999226781732358023
11186264457529913575817500819983923628461524988108896023224436217377161808635701
54684840586223297928538756234865564405369626220189635710288123615675125433383032
70029097668650568557157505516727518899194129711337690149916181315171544007728650
57318955745092033018530484711381831540732405331903846208403642176370391155063978
90007428536721962809034779745333204683687958685802379522186291200807428195513179
48157624448298518461509704888027274721574688131594750409732115080498190455803416
826949787141316063210686391511681774304792596709376

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19