Estoy haciendo un algoritmo que verifica si un número es primo para la universidad, pero encontré un problema de connotación y cálculo en el que necesito considerar números grandes.
Uno de ellos se resolvió con el apoyo de BigInt() , sin embargo en cálculos aritméticos a partir de cierto número de decimales termina perdiendo precisión y en consecuencia devolviendo falso verdadero.
Por ejemplo, multiplicar 2 números que terminan en 1,3,7,9 siempre da como resultado un número que termina en 1,3,7,9, pero a partir de 3**34 los cálculos empiezan a perder precisión.
¿Hay alguna forma eficiente de resolver este problema en JavaScript?
console.log(` ${3**32}, ${BigInt(3**32)} ${3**33}, ${BigInt(3**33)} ${3**34}, ${BigInt(3**34)} ${3**35}, ${BigInt(3**35)} ${3**37}, ${BigInt(3**37)} ${3*1597*3237*5549}, ${BigInt(3*1597*3237*5549)} ${3*1597*3237*5549*13213}, ${BigInt(3*1597*3237*5549*13213)} ${3*1597*3237*5549*13213*4543}, ${BigInt(3*1597*3237*5549*13213*4543)} `);Podrías... no usar Javascript 😉
Fuera de eso, podría tomar la implementación ANSI C de Mike Cowlishaw del paquete decNumber o decFloats aritmético decimal de precisión arbitraria ( http://speleotrove.com/decimal/#decNumber ) y escribir enlaces Node.js para ello.
Mike Cowlishaw sabe un par de cosas sobre aritmética:
En 1998 y 1999 también fue editor de proyectos y presidente técnico del estándar internacional ECMAScript (JavaScript) (ahora ISO 16262).
Desde 1999 hasta 2009, trabajó en nuevos paquetes de aritmética decimal (incluida la clase BigDecimal de IBM para Java y la biblioteca decNumber C), inventó la codificación Densely Packed Decimal y ayudó a especificar una nueva arquitectura de hardware decimal. Es el autor de las especificaciones de aritmética decimal general y fue el líder de especificación de las mejoras de aritmética decimal incluidas en Java 5 en 2004.
Mike defendió la adición de nuevos tipos decimales y aritmética al estándar IEEE 754 para aritmética de punto flotante y a C, C++, COBOL y otros lenguajes (así como en hardware), y permanece activo en el trabajo relacionado de un número de organizaciones de estándares, incluidas ECMA, ISO, ANSI, IEEE, BSI y W3C. Ha sido editor del estándar IEEE 754 desde su primera votación en 2007 y hasta su publicación en 2008 y como ISO/IEC/IEEE 60559 en 2011, y fue miembro del Comité de programa del Simposio IEEE sobre aritmética informática. IEEE 754 se mejoró aún más, con Mike como editor, y el estándar revisado se publicó en 2019.
Se recomiendan números de tipo BigInt para este tipo de operación. Creía que BigInt() era solo un método de conversión, pero también es una unidad numérica.
los cálculos también deben hacerse usando el mismo formato de número, y si una división da como resultado una fracción, se redondea hacia abajo.
console.log(` ${3n**32n} ${3n**33n} ${3n**34n} ${3n**35n} ${3n**37n} ${3n*1597n*3237n*5549n} ${3n*1597n*3237n*5549n*13213n} ${3n*1597n*3237n*5549n*13213n*4543n} ${1n/3n} ${2n/3n} `);