Este es el comando perlnumber que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.
PROGRAMA:
NOMBRE
perlnumber - semántica de números y operaciones numéricas en Perl
SINOPSIS
$ n = 1234; # entero decimal
$ n = 0b1110011; # entero binario
$ n = 01234; # entero octal
$ n = 0x1234; # entero hexadecimal
$ n = 12.34e-56; # notación exponencial
$ n = "-12.34e56"; # número especificado como una cadena
$ n = "1234"; # número especificado como una cadena
DESCRIPCIÓN
Este documento describe cómo Perl maneja internamente los valores numéricos.
La función de sobrecarga del operador de Perl se ignora por completo aquí. Sobrecarga del operador
permite comportamientos definidos por el usuario para números, como operaciones sobre arbitrariamente grandes
enteros, números de coma flotante con precisión arbitraria, operaciones sobre "exóticas"
números como aritmética modular o aritmética p-ádica, etc. Ver sobrecarga para
Detalles.
Almacenamiento números
Perl puede representar internamente números de 3 formas diferentes: como enteros nativos, como nativos
números de coma flotante y como cadenas decimales. Las cadenas decimales pueden tener una exponencial
parte de notación, como en "12.34e-56". Nativo aquí significa "un formato compatible con el compilador de C
que se utilizó para construir perl ".
El término "nativo" no significa tanto cuando hablamos de enteros nativos, ya que
lo hace cuando se trata de números nativos de coma flotante. La única implicación del término
"nativo" en enteros es que los límites para el máximo y el mínimo admitidos verdaderos
cantidades integrales están cerca de potencias de 2. Sin embargo, los flotadores "nativos" tienen una mayor
Restricción fundamental: pueden representar sólo aquellos números que tienen una
representación "corta" cuando se convierte en una fracción binaria. Por ejemplo, 0.9 no se puede
representado por un flotante nativo, ya que la fracción binaria para 0.9 es infinita:
binario0.1110011001100 ...
con la secuencia 1100 repitiéndose una y otra vez. Además de esta limitación, el
El exponente del número binario también está restringido cuando se representa como un número flotante.
número de punto. En hardware típico, los valores de punto flotante pueden almacenar números con hasta 53
dígitos binarios y con exponentes binarios entre -1024 y 1024. En decimal
representacin esto est cerca de 16 dgitos decimales y exponentes decimales en el rango de
-304..304. El resultado de todo esto es que Perl no puede almacenar un número como
12345678901234567 como un número de punto flotante en tales arquitecturas sin pérdida de
De manera similar, las cadenas decimales pueden representar solo aquellos números que tienen un decimal finito
expansión. Siendo cadenas, y por lo tanto de longitud arbitraria, no hay límite práctico para
el exponente o el número de dígitos decimales de estos números. (Pero date cuenta de que lo que somos
discutiendo las reglas solo para el STORAGE de estos números. El hecho de que puedas almacenar
números tan "grandes" no significa que el optimizar las operaciones sobre estos números se utilizarán todos
los dígitos significativos. Consulte "Operadores numéricos y conversiones numéricas" para obtener más detalles).
De hecho, los números almacenados en el formato de entero nativo pueden almacenarse en el formato
forma nativa, o en la forma nativa sin firmar. Por lo tanto, los límites para los números de Perl almacenados como
los enteros nativos normalmente serían -2 ** 31..2 ** 32-1, con las modificaciones apropiadas en el
caso de enteros de 64 bits. Nuevamente, esto no significa que Perl pueda realizar operaciones solo sobre
enteros en este rango: es posible almacenar muchos más enteros en coma flotante
formato.
Resumiendo, los valores numéricos de Perl pueden almacenar solo aquellos números que tienen un decimal finito
expansión o una expansión binaria "corta".
Numérico operadores y numérico conversiones
Como se mencionó anteriormente, Perl puede almacenar un número en cualquiera de los tres formatos, pero la mayoría
los operadores normalmente comprenden solo uno de esos formatos. Cuando se pasa un valor numérico
como argumento para dicho operador, se convertirá al formato entendido por el
operador.
Seis de tales conversiones son posibles:
entero nativo -> punto flotante nativo (*)
entero nativo -> cadena decimal
punto_fotante nativo -> entero nativo (*)
punto_fotante nativo -> cadena decimal (*)
cadena decimal -> entero nativo
cadena decimal -> punto flotante nativo (*)
Estas conversiones se rigen por las siguientes reglas generales:
· Si el número de origen se puede representar en el formulario de destino, esa representación es
usado.
· Si el número de origen está fuera de los límites representables en el formulario de destino, un
Se utiliza la representación del límite más cercano. (Loss of práctica)
· Si el número de origen se encuentra entre dos números representables en el formulario de destino,
Se utiliza la representación de uno de estos números. (Loss of práctica)
· En las conversiones de "punto flotante nativo -> entero nativo", la magnitud del resultado
es menor o igual que la magnitud de la fuente. ("Redondeo a cero".)
· Si la conversión "cadena decimal -> entero nativo" no se puede realizar sin pérdida de
información, el resultado es compatible con la secuencia de conversión "decimal_string ->
native_floating_point -> native_integer ". En particular, el redondeo está fuertemente sesgado
a 0, aunque un número como "0.99999999999999999999" tiene la posibilidad de redondearse a
1.
RESTRICCIÓN: Las conversiones marcadas con "(*)" implican pasos realizados por el C
compilador. En particular, los errores / características del compilador utilizado pueden provocar la rotura de algunos
de las reglas anteriores.
Sabores of Perl numérico optimizar las operaciones
Las operaciones de Perl que toman un argumento numérico tratan ese argumento en uno de cuatro diferentes
formas: pueden forzarlo a uno de los formatos enteros / flotantes / de cadena, o pueden comportarse
de forma diferente dependiendo del formato del operando. Forzar un valor numérico a
El formato particular no cambia el número almacenado en el valor.
Todos los operadores que necesitan un argumento en formato entero tratan el argumento como en
aritmética modular, por ejemplo, "mod 2 ** 32" en una arquitectura de 32 bits. "sprintf"% u ", -1"
por lo tanto, proporciona el mismo resultado que "sprintf"% u ", ~ 0".
Operadores aritméticos
Los operadores binarios "+" "-" "*" "/" "%" "==" "! =" ">" "<" "> =" "<=" Y el unario
los operadores "-" "abs" y "-" intentarán convertir argumentos en números enteros. Si ambos
las conversiones son posibles sin pérdida de precisión, y la operación se puede realizar
sin pérdida de precisión, se utiliza el resultado entero. De lo contrario, los argumentos son
convertido a formato de coma flotante y se utiliza el resultado de coma flotante. El caché
de conversiones (como se describe arriba) significa que la conversión entera no arroja
alejar partes fraccionarias en números de punto flotante.
++ "++" se comporta como los otros operadores anteriores, excepto que si es una cadena que coincide con el
formato "/ ^ [a-zA-Z] * [0-9] * \ z /" se usa el incremento de cadena descrito en perlop.
Operadores aritméticos durante "use integer"
En ámbitos donde "use integer;" está en vigor, casi todos los operadores enumerados anteriormente
forzar su (s) argumento (s) en formato entero y devolver un resultado entero. los
excepciones, "abs", "++" y "-", no cambian su comportamiento con "use integer;"
Otros operadores matemáticos
Los operadores como "**", "sin" y "exp" fuerzan los argumentos al formato de coma flotante.
Operadores bit a bit
Los argumentos se fuerzan al formato entero si no son cadenas.
Operadores bit a bit durante "use integer"
fuerza los argumentos al formato entero. También las operaciones de turno se utilizan internamente
enteros en lugar del predeterminado unsigned.
Operadores que esperan un número entero
forzar el argumento en el formato entero. Esto es aplicable a la tercera y
cuartos argumentos de "sysread", por ejemplo.
Operadores que esperan una cadena
forzar el argumento en el formato de cadena. Por ejemplo, esto es aplicable a "printf
"% s", $ valor ".
Aunque forzar un argumento en una forma particular no cambia el número almacenado, Perl
recuerda el resultado de tales conversiones. En particular, aunque la primera conversión de este tipo
puede llevar mucho tiempo, las operaciones repetidas no necesitarán rehacer la conversión.
Use perlnumber en línea usando los servicios de onworks.net