Есть ли 128 или 256-битный двойной класс в .net? - PullRequest
7 голосов
/ 03 июня 2010

У меня есть приложение, в котором я хочу использовать большие числа и очень точные числа. Для этого мне нужна была точная интерпретация, а IntX работает только для целых чисел.

Есть ли класс в .net framework или даже третье лицо (желательно бесплатное), которое бы это делало?

Есть ли другой способ сделать это?

Ответы [ 9 ]

9 голосов
/ 03 июня 2010

Может быть, Десятичный тип подойдет для вас?

6 голосов
/ 03 июня 2010

Вы можете использовать свободно доступную произвольную точность, BigDecimal из java.math, которая является частью распространяемого пакета J # от Microsoft и является управляемой библиотекой .NET.

Поместите ссылку на vjslib в свой проект, и вы можете что-то вроде этого:

using java.math;

public void main() 
{
    BigDecimal big = new BigDecimal("1234567890123456789011223344556677889900.0000009876543210000987654321");
    big.add(new BigDecimal(1.0));
    Debug.Print(big);
}

выведет на консоль отладки следующее:

1234567890123456789011223344556677889901.0000009876543210000987654321

Обратите внимание, что, как уже упоминалось, .NET 2010 содержит класс BigInteger , который, по сути, уже был доступен в более ранних версиях, но только как внутренний класс (т. Е. Вам потребуется какое-то отражение, чтобы заставить его работать).

4 голосов
/ 03 июня 2010

Библиотека F # также имеет несколько действительно больших числовых типов, если вы в порядке с этим ...

3 голосов
/ 28 марта 2013

Я долго искал решение для этого, и сегодня наткнулся на эту библиотеку:

Четырехместный Precision Double в C #

Подписанная 128-битная библиотека типов данных с плавающей запятой, с 64 эффективными битами точности (против 53 для двойников) и 64-битной экспонентой (против 11 для двойников). Квадраты имеют большую точность и гораздо больший диапазон, чем удваиваются, и особенно полезны при работе с очень большими или очень маленькими значениями, такими как те, которые в вероятностных моделях. Начиная с версии 2.0, вся арифметика Quad проверяется (недопустимо до 0, переполняется до +/- бесконечности), имеет специальные значения PositiveInfinity, NegativeInfinity и NaN и следует тем же правилам, что и операторы .Net Double арифметика и сравнения (например, 1 / 0 == PositiveInfinity, 0 * PositiveInfinity == NaN, NaN! = NaN), что делает его удобной заменой двойников в существующем коде.

3 голосов
/ 03 июня 2010

Если десятичная дробь у вас не работает, попробуйте реализовать (или получить код откуда-то) Rational арифметику с использованием больших целых чисел. Это обеспечит необходимую точность.

2 голосов
/ 18 июня 2016

Бесстыдная вилка: QPFloat эмулирует стандарт IEEE с полной точностью.

2 голосов
/ 03 июня 2010

Десятичное число - это 128-битный (16-байтовый) тип значения, используемый для высокоточных вычислений. Это тип с плавающей запятой, который представлен внутри как base 10 вместо base 2 (т.е. двоичный). Если вам нужна высокая точность, вы должны использовать десятичную дробь, но недостатком является то, что десятичная дробь примерно в 20 раз медленнее, чем использование чисел с плавающей запятой.

2 голосов
/ 03 июня 2010

Используйте decimal для этого, если это возможно.

1 голос
/ 03 июня 2010

Decimal - 128 бит, если это сработает.

...