2013-05-20 2 views
3

Я хочу создать pi более 16 тысяч чисел после десятичной точки , но проблема в том, что я найду любой тип, который мог бы заполнить мои пожелания. Я попытался использовать объект, но он округляет число после 10 Я думал, используя строку, но тип строки не сможет сделать минус или плюс, и если я буду конвертировать в int, он станет круглым. знаете ли вы какие-либо другие типы я могу использовать или как я могу заставить его работать со строкой , например http://files.extremeoverclocking.com/file.php?f=36 эта программа способна рассчитать до 32 млнвыберите правильный тип переменной C#

Thnx

+1

Возможно попробовать [BitArray] (http://msdn.microsoft.com/en-us/library/ system.collections.bitarray.aspx). См. [Этот вопрос] (http://stackoverflow.com/questions/11282727/how-can-i-use-a-very-large-string-500-million-characters-in-my-program) – tnw

+0

может быть, biginteger? – adt

+1

То, что вы ищете, на более техническом языке вызывается произвольной точностью десятичной (или произвольной точностью). У меня нет личного опыта с ними, но вы можете попробовать ответы на этот вопрос (http://stackoverflow.com/questions/4116078/need-arbitrary-precision-arithmetic-in-c-sharp)? – neminem

ответ

5

Посмотрите на this page и это класс BigNumber.

Первое, что нужно отметить, это то, что мы не можем использовать какие-либо примитивные типы в C#: они просто не имеют достаточной точности (например, у двойного типа имеется только 15 значащих цифр, и мы хотите вычислить, скажем, 10000). Нам нужна библиотека с большим количеством чисел, но в .NET Framework ничего подобного нет, поэтому первое, что нам нужно сделать, это написать класс BigNumber.

Эта страница также дает пример использования для расчета пи из 1000 знаков после запятой, поэтому она должна быть достаточно тривиально, чтобы запустить его на 16000.


Запуск его на 16 000 цифр берет меня около полутора секунд, для 160 000 цифр мне потребуется чуть более 2 минут.

Вот моя PrintAsTable() функция, связанная пост оставляет в качестве упражнения для читателя:

public string PrintAsTable() { 
    var data = Print(); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < data.Length; i++) 
    { 
     if (data[i] == '.') sb.AppendLine("."); 
     else if ((i -1) % 50 == 0) sb.AppendLine(data[i].ToString()); 
     else if ((i -1) % 10 == 0) {sb.Append(data[i].ToString()); sb.Append(" ");} 
     else sb.Append(data[i].ToString()); 
    } 
    return sb.ToString(); 
} 
Смежные вопросы