문제

Hugs> 94535^445
1376320882321377050696053887661515621104890164005282153069726424773999801846841903244827702943487982707454966009456016735041878000604143500908532887464920380605164932112687039059526672109818924234920844448231612532570718657160234177285377733830104834041049076609912488237219608445995072867798430614935403219495883835042862802917980856774134757390782052200512932375660858045003581611863121089979673784484701791210379500218604466721285456487387736825167702127154268533859979529612671925052419513844416493584817268143587955662039327860394141299238613042312035808541735213479394437496215520277526351425482512084759462579494878772787079101513841720202004639843443083454387175700954018825292148776647553122504118229978165851660083576570848983047255050145168802863168613110619584686348869690774233051669081248424584219383477237544209892290799448207462345346336076966775224683516220960618177284844330167142846351091001423033864986042919757795382577032341453971393897073354841924116635150129850119992031076354249371062307034564093077675129303383786693131843907104175619570678630497198824622804914508555467550904967368926176118094672479099827962889569753303773699017596074205893197641101210911874606040804983166177455705972192827752532495287749766682029353154226049380290040508900715169403153139668217790502306177709467234413947747673881158973344492079455405942662489751581189327200960698310350121179918845099840977270519116578719881752429190273998774113278822810866144521416958558406602325070095207349450759264393913367193083149679216066539911941983836313340998945139132421885688290888674594474605510238217590823316979504437667252929278291853368754482552573193289277120902144178425726693671235675042499401282016643202758246845332593475338220708351934511933096882598943512036679145593929114103343255708217768511665236173107020739195152050863630870948954052925049746246549772984384435109578859863612603574306739909728739428192798727373799081111333186135697868385292787575475482883660605162944306327057220313320376280182432763977906971557137715710757099478269250731209785404487629107297262798803645379809868663503452656912571816192881412782623078761411808958183665272686617730596943579533808499348879195167683064937591552734375

Haskell이 왜 그러한 많은 수를 계산할 수 있고 Java와 같은 다른 언어는 (그렇게 쉽게) 할 수 없습니까?

도움이 되었습니까?

해결책

Java는 다음과 같습니다 Biginteger 수업.

그것은이 시설을 언어로 만들 수 있었지만 (많은 언어와 마찬가지로) 원시 기능이 CPU가 지원하는 것들에 밀접하게 맵을 만드는 경향이 있습니다.

반면에 Haskell은 "성능"고려 사항이 크게 관련이없는 수학적 표기법 스타일의 표현력을 강조합니다.

다른 팁

그것은 a입니다 디자인 철학의 차이:

  • Haskell의 디자이너는 사용자가 32 비트 이상이 필요한 정수 계산의 임의의 실패에 놀라지 않을 것이라고 확신하기를 원했습니다.

  • Java의 디자이너는 32 비트 이상이 필요한 정수보다 많은 계산을 수행하여 발생하는 임의의 성능 저하에 대해 사용자가 놀라지 않기를 원했습니다.

각 언어에서는 다른 종류의 정수를 얻기 위해 특별한 일을해야합니다.

기본적으로 임의로 큰 정수를 지원하는 길고 명예로운 언어 이력이 있습니다. 제가 가장 좋아하는 두 가지가 있습니다 그리고 잡담, 25 세 이상입니다.

Haskell의 숫자 리터럴은 과부하되어 여러 콘크리트 유형을 나타낼 수 있습니다 ( Int, Integer, Float 또는 MyOwnNumber).

다음과 같은 유형 정보를 제공하여 특정 유형을 수동으로 선택할 수 있습니다.

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

이 세 가지 값은 다른 유형을 가지고 있으며 이에 대해 수행 된 작업은 다르게 행동합니다.

정확한 크기 Int 구현 의존적이지만 28 비트와 같을 수 있습니다.이 유형은 Java Primitive처럼 동작합니다. int, 예를 들어 오버플로됩니다.

an Integer Java와 같은 임의의 정수 정수를 포함 할 수있는 유형입니다. Biginteger.

그리고 a Float 자바와 같습니다 float, 플로팅 포인트 산술 사용.

숫자 리터럴과 마찬가지로 많은 연산자도 과부하가 발생합니다 (사용 유형 클래스), 그리고 다른 유형으로 사용할 수 있습니다. 그래서 + 운영자는 둘 다 작업 할 수 있습니다 Int모래 Float에스.

귀하의 경우, 유형 정보를 제공하지 않았으므로 통역사는 기본적으로 Integer 유형. 이것은 그것을 의미합니다 ^ 연산자, 또한 선택합니다 Integer 사례. 임의의 정수 정수 계산 허용.

Java는 "원시 데이터 유형"(프로세서가 지원하는 유형)이라는 개념을 가지고 있으며 다른 모든 클래스와 다릅니다.

Haskell에서 Int 다른 모든 유형과 같은 유형이므로 Num 그리고 Integral 사용 된 유형 클래스 (^) ("(^) :: (Num a, Integral b) => a -> b -> a"). 해당 유형의 다른 구성원은 다음과 같습니다 Integer, 모든 크기의 정수를 지원합니다 (자리에 대한 메모리가 충분한 한).

Java에서는 많은 "큰 숫자"라이브러리를 사용할 수 있지만, 이들을위한 작업은 Java의 "원시 유형"에만 해당되기 때문에 익숙한 디스 픽스 연산자를 사용하지 않습니다.

짧고 기본적인 대답은 기본 정수를 구현한다는 것입니다. Java에서 표준 INT는 32 비트입니다. 서명, 그것은 당신에게 다양한 범위를 제공합니다 −2,147,483,648 에게 +2,147,483,647.

즉, Java는 가지고 있습니다 Bignum 수업도. 이를 사용하면 임의로 많은 숫자를 사용할 수 있습니다.

이미 언급했듯이, 32 개의 비트 단어가 있고 전체 범위를 사용하면 둘의 보완을 사용하여 -2^31 ~ 2^31-1을 얻습니다.

몇 비트의 단어를 예약함으로써 이러한 비트는 값에 대한 유형 정보를 전달하는 데 사용될 수 있습니다. 즉, 런타임에 자체 유형을 "알고"값은 가치가 있습니다. 나머지 비트는 값의 데이터를 전달하는 데 사용됩니다.

이러한 나머지 비트에 맞는 정수 값은 단어에 직접 저장할 수 있습니다. 이러한 정수는 일반적으로 'fixnums'라고합니다. 그들이 맞지 않으면, 단어의 유형 비트는 그것이 'bigint'임을 나타내고 나머지 비트는 메모리 포인터를 큰 값이 저장되는 힙에 저장하는 데 사용됩니다.

컴파일러는 산술 표현식을 피연산자에 허용 유형 조합을 덮는 여러 코드 경로로 변환해야합니다. 추가 예 :

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

이 언어에 대한 컴파일러의 많은 최적화는이 작업을 수행하는 데 필요한 런타임 유형 점검의 오버 헤드를 피하는 데 중점을 둡니다. Compiler에게 Fixnum에서 Bignum까지의 자동 강의가 원하지 않는다고 명시 적으로 알리는 방법이 종종 있으며, 대신 32 비트 정수의 오버플로 동작을 원합니다. 이것은 암호화 알고리즘을 효율적으로 구현하는 데 매우 중요 할 수 있습니다.

숫자를 인코딩하는 방법의 문제입니다. 이를 수행하는 전통적인 방법은 주어진 수의 비트로 숫자를 인코딩하는 것입니다. Haskell은 분명히 숫자에 대한 가변 비트 수로이 작업을 수행하지만 일반적으로 하드웨어 가속도는 일반적으로 유한 한 정확도에만 사용할 수 있으므로 소프트웨어에서 모든 수학이 수행된다는 것을 의미합니다.

BigInteger를 사용하여 같은 일을 할 수 있습니다. Haskell은 Java보다 더 간결한 기능적 언어입니다.

우리가 너무 많은 언어를 가지고있는 한 가지 이유는 다른 언어가 다른 가정으로 설계 되었기 때문에 다른 작업에서 더 나은 것이기 때문입니다. 대부분의 기능적 언어는 수학적 기능으로 간단하지만 다른 사용 사례와 어려움을 겪는 경향이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top