Большие целые числа в C#

Я предложил щедрость, потому что я хотел бы знать, действительно ли это лучший способ сделать это. Тем не менее, я также пишу парсер, и поэтому мне нужна эта функциональность, и это то, что я придумал.


Модуль warnings именно то, что вы хотите.

Сначала меня отвратило то, что каждый пример предупреждения, используемого в документах, выглядит как этих :

Traceback (most recent call last):
  File "warnings_warn_raise.py", line 15, in 
    warnings.warn('This is a warning message')
UserWarning: This is a warning message

... что нежелательно, потому что я не хочу, чтобы он был UserWarning, мне нужно собственное собственное имя предупреждения.

Вот решение этого:

import warnings
class AmbiguousStatementWarning(Warning):
    pass

def x():
    warnings.warn("unable to parse statement syntax",
                  AmbiguousStatementWarning, stacklevel=3)
    print("after warning")

def x_caller():
    x()

x_caller()

, который дает:

$ python3 warntest.py 
warntest.py:12: AmbiguousStatementWarning: unable to parse statement syntax
  x_caller()
after warning

64
задан Scott Dorman 10 November 2008 в 20:30
поделиться

11 ответов

Начиная с .NET 4.0 вы можете использовать класс System.Numerics.BigInteger. См. Документацию здесь: http://msdn.microsoft.com/en-us/library/system.numerics.biginteger (v = vs.110) .aspx

Другой альтернативой является IntX класс.

IntX - произвольная точность библиотека целых чисел, написанная на чистом C # 2.0 с быстрым - O (N * log N) - алгоритмы умножения / деления реализация. Это обеспечивает все основные операции над целыми числами, такими как сложение, умножение, сравнение, сдвиг по битам и т. д.

64
ответ дан 24 November 2019 в 15:55
поделиться

См. ответы в этом поток . Необходимо будет использовать одну из сторонних крупных целочисленных доступных библиотек/классов или ожидать C# 4.0, который будет включать собственный тип данных BigInteger.

1
ответ дан 24 November 2019 в 15:55
поделиться

Я использовал Biginteger в предыдущем задании. Я не знаю, какие потребности производительности Вы имеете. Я не использовал его в интенсивной производительностью ситуации, но никогда не имел проблем с ним.

2
ответ дан 24 November 2019 в 15:55
поделиться

Это не поможет Вам, но там, как предполагалось, было классом BigInteger в.Net 3.5; это было сокращено, но от операторов, сделанных в PDC, это будет в.Net 4.0. Они, по-видимому, провели много времени, оптимизировав его, таким образом, производительность должна быть намного лучше, чем, что Вы получаете теперь.

Далее, этим вопросом является по существу дубликат , Как я могу представить очень большое целое число в.NET?

1
ответ дан 24 November 2019 в 15:55
поделиться

Это может походить на странное предложение, но Вы протестировали десятичное число тип, чтобы видеть, как быстро это работает?

десятичный диапазон является В±1.0 Г — 10^в€ ’28 к В±7.9 Г — 10^28, таким образом, это все еще не может быть достаточно большим, но это больше, чем ulong.

Там, как предполагалось, был классом BigInteger в.NET 3.5, но она была сокращена .

2
ответ дан 24 November 2019 в 15:55
поделиться

Я не уверен в производительности, но IronPython также имеет класс BigInteger. Это находится в Microsoft. Сценарии. Математическое пространство имен.

3
ответ дан 24 November 2019 в 15:55
поделиться

Да, это будет медленно, и 10x, различие о том, что я ожидал бы. BigInt использует массив для представления произвольной длины, и все операции должны быть сделаны вручную (в противоположность большей части математики, которая может быть сделана непосредственно с ЦП)

, я даже не знаю, если кодирование руки, он в блоке даст Вам большую часть увеличения производительности по 10x, это довольно чертовски близко. Я искал бы другие способы оптимизировать его - иногда в зависимости от Вашей математической проблемы существуют небольшие приемы, которые можно сделать для создания этого более быстрым.

2
ответ дан 24 November 2019 в 15:55
поделиться

Я считаю, что Вы могли оптимизировать реализацию при выполнении всех операций на BigInts, которые собираются возвратить результаты, меньшие, чем собственный тип (Например, int64) на собственных типах и только иметь дело с большим массивом, если Вы собираетесь переполниться.

редактирование Этот реализация на codeproject, кажется только в 7 раз медленнее... Но с вышеупомянутой оптимизацией Вы могли заставить это работать почти тождественно к собственным типам для небольших чисел.

4
ответ дан 24 November 2019 в 15:55
поделиться

F# также поставки с одной. Можно получить его в Microsoft.FSharp.Math.

9
ответ дан 24 November 2019 в 15:55
поделиться

Here are several implementations of BigInteger in C#. Я использовал реализацию BigInteger Mono, работает довольно быстро (я использовал ее в CompactFramework)

Bouncy Castle

Mono

4
ответ дан 24 November 2019 в 15:55
поделиться

Класс System.Numerics.BigInteger в .NET 4.0 основан на Microsoft.SolverFoundation.Common.BigInteger от Microsoft Research.

Класс Solver Foundation BigInteger выглядит очень производительным.Я не уверен, под какой лицензией он выпущен, но вы можете получить его здесь (загрузите и установите Solver Foundation и найдите Microsoft. Solver.Foundation.dll).

8
ответ дан 24 November 2019 в 15:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: