Почему десятичная дробь точнее двойной, если она имеет меньший диапазон? C # - PullRequest
0 голосов
/ 01 ноября 2018

Я читаю C # в двух словах, и он показывает эту таблицу: enter image description here

Мне трудно понять таблицу. Это говорит о том, что double занимает 64 bits пространства и колеблется от 10^-324 до 10^308. Десятичное число занимает 128 bits пробела, НО также говорит, что оно колеблется от 10^-28 до 10^28. Так что я понимаю, что десятичная дробь занимает больше места, но обеспечивает меньший диапазон? это не имеет большого смысла в моей голове, так как все согласны с тем, что десятичная дробь должна использоваться, когда требуется точность. Кроме того, при выполнении вычисления, подобного = (1/3)*3, желаемым результатом будет 1, но только float и double дают мне 1, decimal дает мне 0.9999 ... Так почему decimal точнее? Я действительно не понимаю.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

что я понимаю здесь, так это то, что десятичная дробь занимает больше места, но обеспечивает более короткий диапазон?

Правильно. Это обеспечивает более высокую точность и меньший диапазон. Очевидно, что если у вас ограниченное количество битов, вы можете увеличить точность только уменьшив диапазон!

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

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

Цель использования десятичной дроби - не более высокая точность. Это меньшая ошибка представления . Более высокая точность является одним из способов достижения меньшей ошибки представления, но десятичная дробь не достигает своей меньшей ошибки представления, будучи более высокой точностью. Он достигает своей меньшей ошибки представления с помощью , точно представляющей десятичные дроби .

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

Кроме того, при выполнении вычисления, подобного = (1/3) * 3, результат желания равен 1, но только с плавающей запятой и удвоением дают мне 1

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

Давайте быстро проверим, сколько их. Мы просто сделаем миллион рационалов и посмотрим:

    var q = from x in Enumerable.Range(1, 1000)
            from y in Enumerable.Range(1, 1000)
            where ((double)x)/y*y != x
            select x + " " + y;
    Console.WriteLine(q.Count()); // 101791

Более 10% всех рациональных чисел с малыми числами представлены в виде двойных чисел с достаточно большой ошибкой представления, что они не превращаются в целые числа при умножении на их знаменатель!

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

почему десятичная дробь точнее?

Десятичная дробь более точная, чем двойная, потому что она имеет больше битов точности.

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

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

Вот почему он называется "десятичным", потому что он представляет собой дроби со степенью десяти . Она представляет собой десятичную систему , которая является системой, которую мы обычно используем для арифметики.

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

В физике нет смещения к точным десятичным величинам. Есть такой уклон в финансах. Используйте десятичные дроби для финансов. Используйте двойники для физики.

0 голосов
/ 01 ноября 2018

Десятичное число не использует показатель степени для увеличения диапазона, оно содержит все цифры (около 29), где double использует показатель степени, но содержит только около 19 цифр, остальное выбрасывается. Экспонента увеличивает дальность, но не точность.

...