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

© 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/.

Fork me on GitHub