2008-11-07 3 views
1

Можно создать дубликат:
Most efficient implementation of a large number classКак обрабатывать огромные числа?

Пусть мне нужно вычислить 2^150000. Очевидно, что число будет превышать размер int, float или double. Как я могу создать тип данных, который допускает нормальные математические функции, но превосходит основные типы номеров?

Если это «зависит от того, какой язык вы используете». Я скажу C#.

+0

огромна .. :)). – mlvljr 2012-01-02 07:50:41

ответ

1

Несколько языков построены для поддержки произвольных больших чисел. Например, вы можете использовать Mathematica. Я попробовал ваш пример в Mathematica, и результат имеет 45155 цифр. Я попробовал тот же пример с bc на машине Unix. bc поддерживает расширенную точность, но не расширенную; он бомбил на примере.

0

Я не знаю C#, но я знаю, что язык программирования Ruby имеет класс BigDemical, который, по-видимому, позволяет использовать номера неограниченного размера.

3

Если C# не отлита из камня, и вы хотите что-то, что просто работает из коробки, тогда есть несколько вариантов. Я знаю лучше всего Python, но я думаю, что языки, подобные Scheme и Ruby, также поддерживают большие числа.

Python: 2**150000. Распечатывает результат примерно через 1 секунду.

Если вы хотите бесплатное программное обеспечение для математики, посмотрите на Maxima или Sage.

+0

просто datapoint, mzscheme чувствует себя намного быстрее, чем Python при вычислении (expt 2 150000) против 2 ** 150000 – Javier 2008-11-07 22:53:48

1

Lisp - ваш друг. По умолчанию biginteger numbers.

1

Мне очень сложно использовать язык без сколь угодно больших чисел: кажется бессмысленным иметь возможность использовать обычные операторы, такие как добавление на большинстве чисел, но переключиться на вызовы методов на экземпляре BigInt просто из-за его размер.

Целая куча языков имеет более полные числовые башни и плавно принуждает при необходимости; например, Allegro Common Lisp оценивает и распечатывает все 45155 цифр (expt 2 150000) в 1 мс.

cl-user(2): (time (expt 2 150000)) 
; cpu time (non-gc) 0 msec user, 0 msec system 
; cpu time (gc)  0 msec user, 0 msec system 
; cpu time (total) 0 msec user, 0 msec system 
; real time 1 msec 
; space allocation: 
; 2 cons cells, 18,784 other bytes, 0 static bytes 
1

В C называется Calc, который является калькулятором произвольной точности. Я использовал его однажды, работая в качестве исследователя и нашел его довольно проста в использовании ...

http://sourceforge.net/projects/calc/

Он может быть запрограммирован для сложных или длительных вычислений и может принимать аргументы из командной строки. В интерактивном режиме он принимает одну команду за раз и отображает ответ.

Обычно команды просто такие выражения, как:

3 * (4 + 1) 

и известково напечатает:

15 

Calc делает арифметические операторы +, -, /, * а также^(возведение в степень),% (модуль) и // (целочисленное деление).

Например:

3 * 19^43 - 1 

будет производить:

29075426613099201338473141505176993450849249622191102976 

значения Calc может быть очень большим. Например:

2^23209 - 1 

напечатает:

402874115778988778181873329071 ... loads of digits ... 3779264511 

Надеется, что это помогает ...

0

Python имеет bignum библиотеки. Если вам нужно реализовать библиотеку bignum на другом языке, вы можете хотя бы использовать Python в качестве ссылки для проверки вашей работы. Обратите внимание, что у bignums есть несколько вариантов реализации, которые не сразу очевидны, если вы не знаете, что ищете.

2

Вы можете также рассмотреть возможность использования Frink, который является языком с возможностью работы с единицами измерения. Он без труда вычисляет 2^150000, занимается фракциями (например, 1/3 + 2/5 -> 11/15), вычисляет 3 метра + 2 дюйма -> 3,0508 м и является полным языком программирования.

Frink - Copyright 2000-2008 Алан Eliasen, [email protected] http://futureboy.us/frinkdocs/

Смежные вопросы