2014-08-28 4 views
0

Недавно я работал с System.Numerics.Complex, и я начал замечать типичный «дрифт» с плавающей запятой, где накопленное значение вычисляется на десятую часть миллионного или что-то в этом роде, которое хорошо известно и распространено с типом float и даже с типом double. Я просмотрел структуру Complex и, конечно же, использовал переменные double. Почему он использует значения double для хранения своих данных, а не значения decimal, которые предназначены для предотвращения этого? Как мне обойти это?Почему System.Numerics.Complex использует удвоение вместо десятичных знаков?

+6

'decimal' не предназначенные для предотвращения дрейфа. Он предназначен для представления точно десятичных значений. Тот факт, что он использует 128 бит, может сделать дрифт более приемлемым для вас, но дополнительная точность достигается за такую ​​производительность, что дизайнеры считают, что большинство будет лучше обслуживаться «сложным» типом на основе «double». –

+2

Природа не считается с 10 пальцами, только люди делают. –

+0

. Десятичный индекс .NET также имеет довольно небольшой показатель (в десятичном, он называется «шкала») диапазона, более или менее между 10^28 и 10^-28. Двойной имеет гораздо больший диапазон. –

ответ

2

Чтобы ответить на ваш вопрос:

  1. double s несколько порядков быстрее, поскольку операции выполняются на аппаратном уровне
  2. база-2 поплавки могут быть болееточным для больших вычислений, так как при сдвиге вверх и вниз меньше «колебания»: 1 бит точности меньше 1 десятичной цифры. Более того, base-2 может использовать неявный ведущий бит, что означает, что они могут представлять больше чисел, чем другие базы.
  3. комплексные номера обычно используются для научных/инженерных приложений, где небольшие относительные ошибки около 10 -16 перевешиваются другими источниками ошибок (например, из-за измерения или модели).
  4. знаков после запятой, с другой стороны, как правило, используются для операций «учет» типа, где ошибки округления является обычно незначительными (т.е. добавлением небольших чисел, умножения целых чисел и т.д.)
Смежные вопросы