Cheat sheet de punto flotante para Perl
Tipos de punto flotante
Perl soporta números de punto flotante nativos de la plataforma como valores escalares; en la práctica esto significa precisión doble del IEEE 754.
Tipos exactos
Perl también puede almacenar números decimales como cadenas, pero los operadores aritméticos integrados los convertirán a enteros o a valores de punto flotante para realizar la operación.
La extensión Math::BigFloat
proporciona un tipo decimal de
precisión arbitraria:
use Math::BigFloat ':constant'
my $f = 0.1 + 0.2; # Devuelve exactamente 0.3
La extensión Number::Fraction
proporciona un tipo de datos fraccionario que
sobrecarga los operadores con aritmética simbólica para fracciones:
use Number::Fraction ':constants';
my $f = '1/2' - '1/3'; # Devuelve 1/6
La extensión Math::BigRat
proporciona funcionalidad similar. Su ventaja es
compatibilidad con las extensiones Math::BigInt
y Math::BigFloat
, pero
no parece soportar literales fraccionarios.
Cómo redondear
Para obtener una cadena:
$result = sprintf("%.2f", 1.2345); # Devuelve 1.23
Para formatear la salida:
printf("%.2f", 1.2); # Imprime 1.20
Ten en cuenta que esto utiliza implícitamente mitad al par.
La variable $#
contiene el formato por defecto para imprimir números, pero
su uso se considera obsoleto.
La extensión Math::Round
proporciona varias funciones para redondear valores
de punto flotante:
use Math::Round qw(:all);
$result = nearest(.1, 4.567) # Imprime 4.6
$result = nearest(.01, 4.567) # Imprime 4.57
La extensión Math::BigFloat
también soporta varios métodos de redondeo:
use Math::BigFloat;
my $n = Math::BigFloat->new(123.455);
my $f1 = $n->round('','-2','common'); # Devuelve 123.46
my $f2 = $n->round('','-2','zero'); # Devuelve 123.45
Recursos
- Semantics of numbers and numeric operations in Perl
- sprintf function
- Math::Round extension
- Number::Fraction extension
- Math::BigRat extension
- Math::BigFloat extension
© Publicado en http://puntoflotante.org/ bajo una licencia Creative Commons Atribución Unported (BY). Original en inglés por Michael Borgwardt en http://floating-point-gui.de/.