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 ratiotipo de Common Lisp y tipos análogos que proporcionan la mayoría de los lenguajes para el cálculo algebraico , como Mathematica y Maple . Muchos lenguajes que no tienen un tipo racional integrado lo proporcionan como un tipo definido por la biblioteca .
Representación
Una variable o valor de ese tipo se representa normalmente como una fracción m / n, donde m y n son dos números enteros , ya sea con una precisión fija o arbitraria . Según el lenguaje, el denominador n puede restringirse para que no sea cero y los dos números pueden mantenerse en forma reducida (sin divisores comunes excepto 1).
Los lenguajes que admiten un tipo de datos racional suelen proporcionar una sintaxis especial para construir dichos valores, y también extienden las operaciones aritméticas básicas ('+', '−', '×', '/', potencias enteras ) y comparaciones ('=', '<', '>', '≤') para actuar sobre ellos, ya sea de forma nativa o mediante las funciones de sobrecarga de operadores proporcionadas por el lenguaje. El compilador puede traducir estas operaciones en una secuencia de instrucciones de máquina enteras o en llamadas de biblioteca . 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 unitario.
Soporte de idiomas
Biblioteca incorporada o central :
- C++ ha incluido soporte para aritmética racional en tiempo de compilación en forma de contenidos del encabezado <ratio> de su biblioteca estándar desde su revisión de 2011 .
- Clojure puede realizar cálculos aritméticos con números racionales y ofrece una forma literal para representarlos.
- Go proporciona números racionales en la biblioteca estándar, en el paquete math/big.
- J proporciona números racionales en el lenguaje base. Por ejemplo,
1r3es un tercio. Los racionales en J utilizan 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,12683021339465478347804472r7322545784478161858100577representa la raíz cuadrada de tres a 50 dígitos decimales. [1] - Julia proporciona números racionales con el operador racional,
//. Por ejemplo, . [2]6//9 == 2//3 && typeof(-4//9) == Rational{Int64} - Haskell proporciona un
Rationaltipo, que en realidad es un alias deRatio Integer(,Ratioque es un tipo polimórfico que implementa números racionales para cualquierIntegraltipo de numerador y denominador). La fracción se construye utilizando el operador %. [3] - La biblioteca Num de OCaml implementa números racionales de precisión arbitraria.
- Perl :
Math::BigRatel módulo principal implementa números racionales de precisión arbitraria. Elbigratpragma 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). El tipo de datosFatRat[5] implementa números racionales de precisión arbitraria. - Python : La biblioteca estándar incluye una
Fractionclase en el módulofractions. [6] - Ruby : soporte nativo utilizando sintaxis especial.
- Smalltalk representa números racionales mediante una
Fractionclase en la formap/qdondepyqson números enteros de tamaño arbitrario. Al aplicar las operaciones aritméticas*,+,-,/, a fracciones se obtiene una fracción reducida .
Con bibliotecas externas :
- Para C y C++ existen proyectos como la Biblioteca Aritmética de Precisión Múltiple GNU .
- La biblioteca Apache Commons Math proporciona números racionales para Java con su
Fractionclase.
Ceceo 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 un número racional es RATIO:
( tipo-de 1/3 ) ⇒ RATIO
La división de dos números 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 se pueden obtener utilizando las funciones homónimas, que reducen un racional a la forma canónica y calculan el numerador o denominador de esa forma respectivamente: [8]
( numerador 12/16 ) ⇒ 3 ( denominador 12/16 ) ⇒ 4
Cálculo con números enteros grandes que devuelven un número racional grande:
( / ( 1- ( exp 2 200 )) ( 1- ( exp 2 43 ))) ⇒ 1606938044258990275541962092341162602522202993782792835301375/8796093022207
Clojure
(impresión (+ 1/10 2/10)) ⇒ 3/10
Julia
Julia> 1 // 10 + 2 // 10 3 // 10
Haskell
En el módulo Datos.Ratio
(1 % 10) + (2 % 10) ⇒ 3 % 10
Raqueta (Plan PLT)
> ( + 1/10 2/10 ) 3/10
Raku
Raku proporciona Ratel tipo por defecto.
mi $v = 0.2 ;
digamos "{$v} es {$v.^name} y tiene numerador {$v.numerator} y denominador {$v.denominator}" ;
# ⇒ 0.2 es Rat y tiene numerador 1 y denominador 5
digamos 0,1 + 0,2
# ⇒ 0,3
digamos ( 0.1 + 0.2 - 0.3 ). fmt ( "%.17f" )
# ⇒ 0.000000000000000000
diga 1 / ( 0.1 + 0.2 - 0.3 )
# ⇒ Intenta dividir por cero al convertir Rational a Str
Rubí
Usando sintaxis especial en 2.1 o más reciente:
irb(main):001:0> pone 1 / 10 r + 2 / 10 r 3/10 => nulo
Referencias
- ^ "Vocabulario/Precisiones numéricas - J Wiki".
- ^ "Números complejos y racionales: documentación de desarrollo del lenguaje Julia". docs.julialang.org . Archivado desde el original el 15 de julio de 2012.
- ^ "Informe de la biblioteca Haskell 98: Números racionales".
- ^ "Rata de clase".
- ^ "Clase FatRat".
- ^ "Fracciones — Números racionales — Documentación de Python 3.10.0".
- ^ HyperSpec de Common Lisp: RELACIÓN
- ^ Función NUMERADOR, DENOMINADOR en Common Lisp HyperSpec
- Donald Knuth , El arte de la programación informática , vol. 2. Addison-Wesley.