Почему System.math и, например, Mathnet.numerics на основе Double?

StackOverflow https://stackoverflow.com/questions/1680907

  •  16-09-2019
  •  | 
  •  

Вопрос

Все методы в System.math принимает double как параметры и возвращает параметры. Константы также типа double. Анкет Я проверил Mathnet.numerics, и то же самое, кажется, так.

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

Это было полезно?

Решение

Это классический компромисс скорости и аккуратности.

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

Наибольшее количество цифр PI, которые вам когда -либо понадобятся, - это 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

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

Другие советы

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

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

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

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

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

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

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

Смотрите следующие статьи на MSDN для деталей.

Двойнойhttp://msdn.microsoft.com/en-us/library/678hzkk9.aspx

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

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

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

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

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

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

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

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

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

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

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

Piece для пользователей компиляторов MSDN Slowdown

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top