2009-11-02 4 views
5

Итак, мы знаем, что фракции, такие как 0,1, не могут быть точно представлены в двоичной базе, которые вызывают точные проблемы (например, упомянутые здесь: Formatting doubles for output in C#).Как иметь дело с тем, что большинство десятичных дробей не может быть точно представлено в двоичном формате?

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

так что нам делать?

+0

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

+1

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

ответ

7

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

Что каждый компьютер ученый должен знать о арифметики с плавающей точкой http://docs.sun.com/source/806-3568/ncg_goldberg.html

+3

Вы уверены, что достаточно конкретно? –

+0

Спасибо за ссылку. –

1

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

3

так что нам делать?

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

Проблема в следующем фрагменте кода с WriteLine(), а не в расчете (ы):

double x = 6.9 - 10 * 0.69; 
Console.WriteLine("x = {0}", x); 

Если у вас есть конкретные проблемы, й пост его. Обычно существуют способы предотвратить потерю точности. Если вам действительно нужно> = 30 десятичных цифр, вам нужна специальная библиотека.

4

О, что нам делать с тем, что большинство десятичных дробей не может быть представлено в двоичном формате? или в этом отношении, что двоичные дроби не могут быть представлены в десятичном формате?

или, даже, что бесконечность (фактически бесконечная бесконечность) вещественных чисел во всех базах не может быть точно представлена ​​в любой компьютеризированной системе?

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

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

+0

Есть ли счетная бесконечность? –

+2

Да, число рациональных чисел (фракций или технически, те числа, которые могут быть выражены как отношение двух целых чисел), счетно ... Доказательство состоит в перечислении всех целых чисел в виде строк и столбцов в таблице , и каждая ячейка содержит фракцию, которая является значением столбца, деленным на значение строки. Затем вы «подсчитываете» по диагонали (слева направо в верхнем правом направлении), начиная с верхней левой ячейки (1/1), затем вторая диагональ 1/2, 2/1, затем третья диагональ 1/3, 2/2, 3/1 и т. Д. Эта процедура эффективно «подсчитывает» рациональность ... –

+0

Кантор придумал это (в 1800-х годах, я думаю) он назвал этот первый уровень бесконечности алеф-нулем или алефом нулем. Число действительных чисел (рациональных и иррациональных, таких как sqrt (2), aleph = One и несчетно. Он доказал, что существует бесконечное количество уровней бесконечности, хотя это не в моих силах объяснить в комментарии! –

3

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

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

В финансовом мире, например, будут конкретные требования к точности неявно или явно. В некоторых налоговых юрисдикциях США налоговые ставки устанавливаются на 5 цифр после десятичного знака. Ваша схема округления должна обеспечивать такую ​​точность. Когда большая часть Западной Европы обратилась в Евро, был очень конкретный подход к округлению, который был написан в соответствии с законом. В течение этого переходного периода было необходимо округлить, как требуется.

Знайте правила своего домена и проверьте, что ваша схема округления удовлетворяет этим правилам.

2

Я думаю, что каждый подразумевает: Инвертирование разреженной матрицы? «Есть приложение для этого» и т. Д. И т. Д.

Численное вычисление - это одна хорошо высеченная лошадь. Если у вас есть проблема, это, вероятно, было пастбище до 1970 года или даже намного раньше, перенесенное библиотеку через библиотеку или фрагмент фрагмента в будущее.

1

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

Несколько поддержки в Math methodsсделатьdecimal: Abs, Ceiling, Floor, Max, Min, Round, Sign и Truncate. Что общего у этих функций, так это то, что они возвращают точные результаты. Это согласуется с целью decimal: Сделать точный арифметический с номерами базы-10.

тригонометрические и Exp/Log/Pow функции возвращают приблизительные ответы, так что бы точку наличия перегрузки для «точного» арифметического типа?

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

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