Pregunta

Hugs> 94535^445
1376320882321377050696053887661515621104890164005282153069726424773999801846841903244827702943487982707454966009456016735041878000604143500908532887464920380605164932112687039059526672109818924234920844448231612532570718657160234177285377733830104834041049076609912488237219608445995072867798430614935403219495883835042862802917980856774134757390782052200512932375660858045003581611863121089979673784484701791210379500218604466721285456487387736825167702127154268533859979529612671925052419513844416493584817268143587955662039327860394141299238613042312035808541735213479394437496215520277526351425482512084759462579494878772787079101513841720202004639843443083454387175700954018825292148776647553122504118229978165851660083576570848983047255050145168802863168613110619584686348869690774233051669081248424584219383477237544209892290799448207462345346336076966775224683516220960618177284844330167142846351091001423033864986042919757795382577032341453971393897073354841924116635150129850119992031076354249371062307034564093077675129303383786693131843907104175619570678630497198824622804914508555467550904967368926176118094672479099827962889569753303773699017596074205893197641101210911874606040804983166177455705972192827752532495287749766682029353154226049380290040508900715169403153139668217790502306177709467234413947747673881158973344492079455405942662489751581189327200960698310350121179918845099840977270519116578719881752429190273998774113278822810866144521416958558406602325070095207349450759264393913367193083149679216066539911941983836313340998945139132421885688290888674594474605510238217590823316979504437667252929278291853368754482552573193289277120902144178425726693671235675042499401282016643202758246845332593475338220708351934511933096882598943512036679145593929114103343255708217768511665236173107020739195152050863630870948954052925049746246549772984384435109578859863612603574306739909728739428192798727373799081111333186135697868385292787575475482883660605162944306327057220313320376280182432763977906971557137715710757099478269250731209785404487629107297262798803645379809868663503452656912571816192881412782623078761411808958183665272686617730596943579533808499348879195167683064937591552734375

¿Por qué Haskell puede calcular un número tan grande y otros lenguajes, como Java, no pueden (tan fácilmente)?

¿Fue útil?

Solución

BigInteger clase .

Podría haber construido esta instalación en la lengua, pero (como muchos idiomas) que tiende a hacer que las características primitivas se corresponden estrechamente a las cosas que son soportados por la CPU.

Haskell, por otro lado destaca la expresividad en el estilo de notación matemática, donde las consideraciones de "rendimiento" son en gran medida irrelevante.

Otros consejos

Es un diferencia en la filosofía de diseño

  • Los diseñadores de Haskell querían estar seguros de que los usuarios no estarían sorprendidos por el fracaso aparentemente arbitraria de un cálculo entero necesitan más de 32 bits.

  • Los diseñadores de Java querían estar seguros de que los usuarios no estarían sorprendidos por la degradación del rendimiento aparentemente arbitraria causada por hacer una gran cantidad de cálculos sobre números enteros que necesitan más de 32 bits.

En cada idioma, lo que tiene que hacer algo especial para conseguir que el otro tipo de número entero.

Hay una historia larga y honorable de las lenguas apoyo arbitrariamente grandes números enteros por defecto. Dos de mis favoritos son Icono y Smalltalk , que son a la vez más de 25 años de edad.

Los literales numéricos en Haskell están sobrecargados de modo que puedan representar múltiples tipos de hormigón (como Int, Integer, Float o incluso MyOwnNumber).

Se puede elegir manualmente un tipo específico al proporcionar información de tipo, así:

x = 4 :: Int
y = 4 :: Integer
z = 4 :: Float

Estos tres valores tienen diferentes tipos y operaciones realizadas en éstos se comportarán de forma diferente.

El tamaño exacto de un Int depende de la implementación, pero puede ser algo así como 28 bits, este tipo se comporta como un int primitiva de Java, por ejemplo, que se desbordará.

Una Integer es un tipo que puede contener enteros de precisión arbitraria, al igual que el de Java BigInteger .

Y un Float es como un float Java, utilizando la aritmética de coma flotante.

Al igual que los literales numéricos, también están sobrecargados muchos operadores (utilizando el tipo clases ), y por lo tanto se puede utilizar con los diferentes tipos. Por lo que el operador + puede trabajar con ambas Ints y Floats.

En su caso, ya que usted no proporcionó ninguna información de tipo, el intérprete será por defecto el tipo Integer. Esto significa que para el operador ^, también se elegirá la instancia Integer. Teniendo en cuenta los cálculos de enteros de precisión arbitraria.

Java tiene la noción de "tipos de datos primitivos" (que son los tipos que admite el procesador) y los que son diferentes de todas las otras clases.

En Haskell, Int es un tipo como todos los otros tipos, y por lo tanto fácilmente se hizo un miembro de las clases de tipos Num y Integral utilizados en (^) ("(^) :: (Num a, Integral b) => a -> b -> a"). Otro de los miembros de esas clases de tipos es Integer, que apoya enteros de todos los tamaños (siempre y cuando usted tiene suficiente memoria para sus dígitos).

En Java, se pueden utilizar muchos "grandes números" bibliotecas, pero las operaciones para ellos no va a usar los operadores infijos que se utilizan para, porque esas son sólo para los "tipos primitivos" en Java.

La respuesta corta y básica es que se implementan enteros predeterminados differentes. En Java, un int estándar es de 32 bits. Firmado, que le da una gama de −2,147,483,648 a +2,147,483,647.

Una vez dicho esto, Java tiene clases bignum también. Si utiliza estos, además, obtendrá la capacidad de utilizar arbitrariamente grandes números.

Como ya se ha mencionado, si tiene palabras de 32 bits y utiliza toda la gama se obtienen -2 ^ 31 a 2 ^ 31-1 usando complemento a dos.

Al reservar unos pocos bits de la palabra, los bits se pueden utilizar para llevar tipo de información para el valor. Es decir, los valores de "saber" su propio tipo en tiempo de ejecución. Los bits restantes se utilizan para transportar los datos del valor.

Los valores enteros que encajan en estos bits restantes pueden ser almacenados directamente en la palabra. Tales números enteros se suele llamar '' fixnums. Si no encajan, a continuación, los bits de tipo de la palabra indican que es un 'bigint', y los bits restantes se utilizan para almacenar un puntero de memoria en el montón donde se almacena el valor BIGINT.

El compilador necesita para traducir sus expresiones aritméticas en múltiples rutas de código que cubren permiten combinaciones de tipos de los operandos. Ejemplo para la adición:

  • fixnum + fixnum
  • bigint + fixnum
  • fixnum + bigint
  • bigint + bigint

Una gran cantidad de optimizaciones en los compiladores de estos idiomas se centran en evitar la sobrecarga para el tipo de controles de tiempo de ejecución necesarios para hacer este trabajo. A menudo hay también maneras de decir explícitamente al compilador que la degradación automática de fixnum a bignum es indeseable, y en su lugar se desea que el comportamiento de desbordamiento de enteros de 32 bits. Esto puede ser muy importante para la implementación de algoritmos de criptografía de manera eficiente.

Es una cuestión de cómo codificar los números. La forma tradicional de hacer esto es para codificar los números con un número determinado de bits, donde no se puede tener una precisión infinita. Haskell aparentemente hacer esto con un número variable de bits para un número que también está muy bien, pero por lo general significa que toda la matemática ha cosas sean hechas con software, como la aceleración de hardware es generalmente sólo están disponibles para la precisión finita.

Puede utilizar BigInteger a hacer lo mismo. Haskell es un lenguaje funcional que es más conciso que Java.

Una de las razones que tenemos tantas lenguas diferentes idiomas es que son mejores para diferentes tareas, ya que fueron diseñados con diferentes supuestos. La mayoría de los lenguajes funcionales son más simples con funciones matemáticas, pero tienden a luchar con otros casos de uso, por ejemplo, Haskell es poco probable que sea una buena opción para escribir una interfaz gráfica de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top