Algunos lenguajes de programación proporcionan un tipo de datos racional integrado (primitivo) para representar números racionales como 1/3 y -11/17 sin redondeo , y para realizar operaciones aritméticas con ellos. Algunos ejemplos son el ratio
tipo de Common Lisp y los tipos análogos proporcionados por la mayoría de los lenguajes para el cálculo algebraico , como Mathematica y Maple . Muchos lenguajes que no tienen un tipo racional incorporado todavía lo proporcionan como un tipo definido por biblioteca .
Representación
Una variable o valor de ese tipo se suele representar como una fracción m / n , donde m y n son dos enteros números, ya sea con un fijo o precisión arbitraria . Dependiendo del idioma, el denominador n puede restringirse para que sea distinto de cero , y los dos números pueden mantenerse en forma reducida (sin ningún divisor común excepto 1).
Los lenguajes que admiten un tipo de datos racionales suelen proporcionar una sintaxis especial para construir dichos valores y también amplían las operaciones aritméticas básicas ('+', '-', '×', '/', potencias enteras ) y comparaciones ('=', '<', '>', '≤') para actuar sobre ellos, ya sea de forma nativa o mediante las facilidades de sobrecarga del operador proporcionadas por el idioma. El compilador puede traducir estas operaciones en una secuencia de instrucciones de máquina enteras o en llamadas a bibliotecas . El soporte también puede extenderse a otras operaciones, como formatear, redondear a un valor entero o de punto flotante , etc. Como en matemáticas, esos lenguajes a menudo interpretan un valor entero como equivalente a un valor racional con un denominador de unidad.
Ayuda de idioma
Biblioteca incorporada o central :
- C ++ ha incluido el apoyo para la aritmética racional en tiempo de compilación en forma de los contenidos de su biblioteca estándar 's
encabezado desde su revisión 2011 . - Clojure puede realizar operaciones aritméticas en números racionales y ofrece una forma literal para representarlos.
- Go proporciona números racionales en la biblioteca estándar, en el
math/big
paquete . - J proporciona números racionales en el idioma base. Por ejemplo,
1r3
es un tercio. Los racionales en J usan números enteros de precisión arbitraria tanto para el numerador como para el denominador, lo que permite números no enteros de precisión arbitraria. Por ejemplo,12683021339465478347804472r7322545784478161858100577
representa la raíz cuadrada de tres a 50 dígitos decimales. [1] - Julia proporciona los números racionales con el operador racional,
//
. Por ejemplo ,. [2]6//9 == 2//3 && typeof(-4//9) == Rational{Int64}
- Haskell proporciona un
Rational
tipo, que en realidad es un alias paraRatio Integer
(Ratio
ser un tipo polimórfico que implementa números racionales para cualquierIntegral
tipo de numeradores y denominadores). La fracción se construye utilizando el operador%. [3] - La biblioteca Num de OCaml implementa números racionales de precisión arbitraria.
- Perl : el
Math::BigRat
módulo principal implementa números racionales de precisión arbitraria. Elbigrat
pragma se puede utilizar para activar el soporte transparente de BigRat. - Raku : utiliza por defecto el tipo
Rat
[4] (números racionales con precisión limitada).FatRat
[5] tipo de datos implementa números racionales de precisión arbitraria. - Python 2.6+: la biblioteca estándar de Python incluye una
Fraction
clase en el módulofractions
. [6] - Ruby 2.1 o más reciente: soporte nativo con sintaxis especial.
- Ruby pre 2.1: a través de la biblioteca estándar incluye una
Rational
clase en el módulorational
. - Smalltalk representa números racionales usando una
Fraction
clase en la formap/q
dondep
yq
son enteros de tamaño arbitrario. La aplicación de las operaciones aritméticas*
,+
,-
,/
, a fracciones devuelve una fracción reducida .
Con bibliotecas externas :
- Para C & C ++ hay proyectos como la Biblioteca aritmética de precisión múltiple de GNU .
- La biblioteca Apache Commons Math proporciona números racionales para Java con su
Fraction
clase.
Lisp común
Common Lisp proporciona un tipo de datos numéricos para números racionales de tamaño arbitrario: RATIO . [7]
1/3 ⇒ 1/3
El tipo de número racional es RATIO
:
( tipo de 1/3 ) ⇒ RELACIÓN
Dividir dos enteros puede devolver un número racional y la multiplicación de un número racional puede devolver un número entero:
( / 6 8 ) ⇒ 3/4 ( * 3/4 16 ) ⇒ 12
El numerador y el denominador pueden obtenerse usando las funciones homónimas, que reducen una forma racional a canónica y calculan el numerador o denominador de esa forma respectivamente: [8]
( numerador 12/16 ) ⇒ 3 ( denominador 12/16 ) ⇒ 4
Calcular con números enteros grandes que devuelven un número racional grande:
( / ( 1- ( expt 2 200 )) ( 1- ( expt 2 43 ))) ⇒ 1606938044258990275541962092341162602522202993782792835301375/8796093022207
Clojure
(imprimir (+ 1/10 2/10)) ⇒ 3/10
Julia
julia> 1 // 10 + 2 // 10 3 // 10
Haskell
En el módulo Data.Ratio
(1% 10) + (2% 10) ⇒ 3% 10
Raqueta (esquema PLT)
> ( + 1/10 2/10 ) 3/10
Raku
Raku proporciona Rat
tipo por defecto.
mi $ v = 0.2 ;decir "{$ v} es {$ v. ^ nombre} y tiene numerador {$ v.numerator} y denominador {$ v.denominator}" ;# ⇒ 0.2 es Rata y tiene numerador 1 y denominador 5
digamos 0,1 + 0,2 # ⇒ 0,3
digamos ( 0.1 + 0.2 - 0.3 ). fmt ( "% .17f" ) # ⇒ 0,00000000000000000
digamos 1 / ( 0.1 + 0.2 - 0.3 ) # ⇒ Intente dividir por cero al forzar a Rational a Str
Rubí
Usando una sintaxis especial en 2.1 o más reciente:
IRB (principal): 001: 0> pone 1 / 10 r + 2 / 10 r 3/10 => nil
Referencias
- ^ http://www.jsoftware.com/jwiki/Vocabulary/NumericPrecisions
- ^ http://docs.julialang.org/en/latest/manual/complex-and-rational-numbers/#rational-numbers
- ^ https://www.haskell.org/onlinereport/ratio.html
- ^ https://docs.raku.org/type/Rat
- ^ https://docs.raku.org/type/FatRat
- ^ https://docs.python.org/3/library/fractions.html
- ^ Common Lisp HyperSpec: RATIO
- ^ Función NUMERADOR, DENOMINADOR en Common Lisp HyperSpec
- Donald Knuth , El arte de la programación informática , vol. 2. Addison-Wesley.