2009-11-05 2 views
7

Все методы в System.Math принимают double как параметры и возвращают параметры. Константы также имеют тип double. Я проверил MathNet.Numerics, и, похоже, это так.Почему System.Math и, например, MathNet.Numerics на основе double?

Почему это? Особенно для констант. Не должно быть, точнее, decimal? Разве это не было бы полезно при расчетах?

ответ

16

Это классическая комбинация скорости и точности.

Однако, имейте в виду, что для PI, например, самые цифры вы когда-нибудь понадобится в 41.

Наибольшее количество цифр пи что вам когда-нибудь понадобится это 41. вычислить окружность юнита с погрешностью меньше диаметра протона , вам нужно 41 цифр pi †. Кажется безопасным, чтобы пришел к выводу, что достаточно 41 цифры точность в pi для любого круга проблема измерения вы, вероятно, должны встреча. Таким образом, в более чем триллионах цифр pi, вычисленных в 2002, все цифры за 41-й имеют практического значения.

Кроме того, десятичные и двойные имеют немного другую внутреннюю структуру хранения. Десятичные числа предназначены для хранения данных базы 10, где в качестве удвоений (и плавающих) используются для хранения двоичных данных. На двоичной машине (например, на каждом компьютере) двойник будет иметь меньше потраченных впустую бит при хранении любого числа в пределах своего диапазона.

считает также:

System.Double  8 bytes Approximately ±5.0e-324 to ±1.7e308 with 15 or 16 significant figures 
System.Decimal 12 bytes Approximately ±1.0e-28 to ±7.9e28 with 28 or 29 significant figures

Как вы можете видеть, десятичный имеет меньший диапазон, но более высокую точность.

+1

Хорошая цитата! Где вы это нашли? – Jrud

+2

http://web.sbu.edu/math/PiDay.html –

+0

Очень приятно! – Svish

3

Десятичный более точный, но имеет меньший диапазон. Обычно вы использовали Double для физических и математических вычислений, но вы бы использовали Decimal для финансовых и денежных расчетов.

Подробнее см. В следующих статьях msdn.

Double http://msdn.microsoft.com/en-us/library/678hzkk9.aspx

Десятичного http://msdn.microsoft.com/en-us/library/364x0z75.aspx

+1

-1 потому что десятичное значение не более точное, чем двойное. Это зависит от того, какую ценность вы пытаетесь представить. попытайтесь представить двоичное рациональное число 0.00101101 x 2^(- 00011011001). вы обнаружите, что двойник может представлять его со 100% -ной acccuracy, десятичный не может. –

+1

Я изменил слово с «точного», как используется в вопросе, на «точное», как используется в статьях MSDN. Точность - это точность, на которую представлено число. Десятичный имеет большую точность, чем Double .... –

+0

взлетел на downvote, но все равно сделает (я признаю придирчивую) точку, что независимо от точности (количество цифр) точность компьютерного представления значения зависит больше, на какую реальную ценность вы пытаетесь представить, чем на количество цифр, которые вы можете представить. Но +1 для разграничения между физическими/математическими и финансовыми/денежными приложениями –

0

Если бы я догадка, я бы сказал, что эти функции рычагов низкого уровня по математике функциональности (возможно, в C), который не использует десятичный внутренне, и поэтому возврат десятичной суммы потребует от двух до десятичных знаков. Кроме того, целью типа десятичного значения является обеспечение точности; эти функции не выполняются, и не может возвращает 100% точные результаты без бесконечной точности (например, иррациональные числа).

4

Нет, - десятичные знаки больше не являются «точными», чем двойные или, если на то пошло, любые типы. Понятие «точность», (когда речь идет о численных представлениях в вычислителе), является тем, что не так.Любой тип абсолютно на 100% точнее при представлении номера. unsigned bytes на 100% точны при представлении целых чисел от 0 до 255. Но они не подходят для фракций или для негативов или целых чисел вне диапазона.

Десятичные числа на 100% точны при представлении определенного набора базы 10 значений. удваивается (поскольку они сохраняют свое значение с помощью двоичного IEEE экспоненциального представления) являются точным при представляющем множестве бинарных чисел. Точно так же, как и другие, они просто предназначены для разных целей.

Выработать немного Furthur, так как я, кажется, не достаточно ясно, для некоторых читателей ...

Если взять каждое число, которое представляется в виде десятичного знака, и отметьте каждую из них на числовой прямой между каждый смежная пара из них есть дополнительный бесконечность действительных чисел, которые не представима в виде десятичной дроби. Точно такое же утверждение можно сделать о числах, которые могут быть представлены как двойные. Если вы отметили каждую десятичную цифру на числовой строке синим цветом, а каждый двойной в красном, за исключением целых чисел, было бы очень мало мест, где одинаковое значение было отмечено в обоих цветах. В общем, за 99,99999% знаков (пожалуйста, не делайте ничтожного моего процента) синий набор (десятичные знаки) - это совершенно другой набор чисел из красного набора (удваивается).

Это связано с тем, что по нашему самому определению для синего набора это то, что оно является базовым представлением 10 мантиссы/экспоненты, а double является базовым представлением 2 мантиссы/экспоненты. Любое значение, представленное в качестве базы 2 мантиссы и показателя, (1.00110101001 x 2^(-11101001101001) означает взять значение мантиссы (1.00110101001) и умножить его на 2 при повышении до степени экспоненты (при экспоненте отрицательно это равносильно делению на 2 на мощность абсолютного значения экспонента). Это означает, что если экспонента отрицательна (или где какая-либо часть мантиссы является дробной двоичной единицей), то число не может быть представлено в виде десятичной мантиссы и экспоненты и наоборот.

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

+0

+1, всегда используйте тип данных, который представляет то, что вам нужно ... –

+0

Bah, -1 для педантизма. Десятичные типы данных могут точно представлять DECIMAL-фракцию, тогда как типы данных с плавающей запятой могут быть или не быть в состоянии. Поскольку наши пользователи почти всегда используют десятичные дроби, это важно. Если когда-нибудь вас попросят написать программное обеспечение для группы иностранцев, которые обычно используют двоичные дроби, то float будет точно так же «точным». Для измерений это, возможно, спорный вопрос, так как в любом случае нет такого понятия, как «точное измерение». Хотя даже там, если пользователь вводит «7.3», они предположительно ожидают получить «7.3» назад, а не «7.3000000001». – Jay

+5

Это не педиатр Джей. Это меньше, чем минимум, который вы * нужно * понимать, чтобы точно и эффективно выполнять математику с плавающей запятой. Цель двойников - обеспечить быстрый расчет физических величин, где ошибка представления намного меньше, чем ошибка измерения; понимание которого имеет решающее значение. –

0

Ни Decimal, ни float или double не являются достаточно хорошими, если вам требуется что-то точное. Кроме того, Decimal настолько дорогой и чрезмерным, что он становится обычной шуткой.

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

Фактическая проблема с CLR в целом заключается в том, что она настолько странная и обычная для реализации библиотеки, которая имеет дело с числами в общем виде, в основном из-за плохого примитивного дизайна и недостатка самого популярного компилятора для платформы. Это почти то же самое, что и с фиаско Java.

double просто оказывается лучшим компромиссом, охватывающим большинство доменов, и он работает хорошо, несмотря на то, что MS JIT по-прежнему неспособен использовать технологию CPU, которой сейчас около 15 лет.

[часть пользователей трансляторов замедления MSDN]

0

Двойной встроенный в тип. Is поддерживается ядром FPU/SSE (ранее называемым «Math coprocessor»), поэтому он невероятно быстро. Особенно при умножении и научных функциях.

Десятичная на самом деле сложная структура, состоящая из нескольких целых чисел.

1

Похоже, что большинство аргументов здесь «Я не делаю то, что хочу», «но это быстрее», так же, как и библиотека ANSI C + Gmp, но никто не защищает это право?

Если вы особенно хотите контролировать точность, то есть и другие языки, которые нашли время, чтобы осуществить точную точность, в удобной для пользователя контролируемым образом:

http://www.doughellmann.com/PyMOTW/decimal/

Если точность очень важна для вас, то вам, вероятно, лучше использовать языки, которые будут использовать математики. Если вам не нравится Fortran, то Python - это современная альтернатива.

Какой бы язык вы работаете, помните золотое правило: Избегайте смешивания типов ... Так что конвертировать и Ь, чтобы быть таким же, прежде чем попытаться оператор В

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

  • Нет связанных вопросов^_^