Точность С#
От: MAPCUAHUH  
Дата: 10.04.06 14:45
Оценка:
Здраствуйте,
у мененя возникла такая проблема:

ArrayList l = new ArrayList();
            l.Add(0.0);
            l.Add(0.2);
            l.Add(0.4);
            l.Add(0.6);
            l.Add(0.8);

            ArrayList l2 = new ArrayList();

            double h = 0;
            for (int i = 0; i < 5; i++)
            {
                l2.Add(h);
                h += 0.2;
            }

            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(((double)l[i] - (double)l2[i]));
            }


Выводит на экран:
0
0
0
-1,11022302462516E-16
0

Как увеличить точность прибавления 0.2????
Re: Точность С#
От: Oyster Украина https://github.com/devoyster
Дата: 10.04.06 14:59
Оценка: +1
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Как увеличить точность прибавления 0.2????


Да никак — это вечная история с float-ами, и не только на C#. Невозможно всегда хранить мантиссу точно — из-за этого и возникает погрешность. Могу предложить сравнивать float-ы не напрямую с помощью ==, а смотреть, входит ли их разность в некоторый малый диапазон — тоже стандартный подход. Ну или использовать числа с фиксированной точкой — такие, как decimal, например, — если диапазона хватает.
Re[2]: Точность С#
От: Ice Dragon Россия  
Дата: 10.04.06 15:10
Оценка: -1
Здравствуйте, Oyster, Вы писали:

O> Ну или использовать числа с фиксированной точкой — такие, как decimal, например, — если диапазона хватает.


Он не с фиксированной, а с плавающей, просто мантисса имеет основанием 10, а не 2.
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения. (Бенджамин Франклин)
Re: Точность С#
От: ka1eka Россия  
Дата: 10.04.06 15:32
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Как увеличить точность прибавления 0.2????


например, так:
...
for (int i = 0; i < 5; i++)
{
   l2.Add(h);
   h = (i + 1) / 5.0;
}
...
Re[3]: Точность С#
От: GarryIV  
Дата: 10.04.06 16:07
Оценка: -1
Здравствуйте, Ice Dragon, Вы писали:

O>> Ну или использовать числа с фиксированной точкой — такие, как decimal, например, — если диапазона хватает.

ID>Он не с фиксированной, а с плавающей, просто мантисса имеет основанием 10, а не 2.

Учи матчасть

A decimal number is a signed, fixed-point value consisting of an integral part and an optional fractional part. The integral and fractional parts consist of a series of digits that range from zero to nine (0 to 9), separated by a decimal point symbol.


подробности тут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDecimalClassTopic.asp
WBR, Igor Evgrafov
Re[2]: Точность С#
От: MAPCUAHUH  
Дата: 10.04.06 18:02
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Здравствуйте, MAPCUAHUH, Вы писали:


MAP>>Как увеличить точность прибавления 0.2????


O>Да никак — это вечная история с float-ами, и не только на C#. Невозможно всегда хранить мантиссу точно — из-за этого и возникает погрешность. Могу предложить сравнивать float-ы не напрямую с помощью ==, а смотреть, входит ли их разность в некоторый малый диапазон — тоже стандартный подход. Ну или использовать числа с фиксированной точкой — такие, как decimal, например, — если диапазона хватает.


Увы это не пройдет, т.к я ищу их в Hashtable как ключи и получаю Null из-за этой погрешности((
Тогда раз так не проходит у меня возник такой вопрос: Порядок Hashtable Keys соответствует порядку Hashtable.Values? в Java нет, а тут?
P.s Неужели выч техника на столько не точная??
Re[3]: Точность С#
От: Аноним  
Дата: 10.04.06 18:22
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Увы это не пройдет, т.к я ищу их в Hashtable как ключи и получаю Null из-за этой погрешности((


А ложить их в качестве строк (ToString) оптимальность не позволяет ??
PS Знаю что неоптимально, но зато решит проблему с погрешностями.
Re[4]: Точность С#
От: Елисей  
Дата: 10.04.06 18:26
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, Ice Dragon, Вы писали:


O>>> Ну или использовать числа с фиксированной точкой — такие, как decimal, например, — если диапазона хватает.

ID>>Он не с фиксированной, а с плавающей, просто мантисса имеет основанием 10, а не 2.

GIV>Учи матчасть


GIV>

GIV>A decimal number is a signed, fixed-point value consisting of an integral part and an optional fractional part. The integral and fractional parts consist of a series of digits that range from zero to nine (0 to 9), separated by a decimal point symbol.


GIV>подробности тут http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDecimalClassTopic.asp


Странно. По ссылке написано: The binary representation of an instance of Decimal consists of a 1-bit sign, a 96-bit integer number, and a scaling factor used to divide the 96-bit integer and specify what portion of it is a decimal fraction.
Т.е. там есть и мантисса (...96-bit integer number...) и экспонента (...scaling factor used to divide the 96-bit integer and specify what portion of it is a decimal fraction).
Re[3]: Точность С#
От: Oyster Украина https://github.com/devoyster
Дата: 10.04.06 21:15
Оценка:
Здравствуйте, Ice Dragon, Вы писали:

ID>Он не с фиксированной, а с плавающей, просто мантисса имеет основанием 10, а не 2.


Ну и формат хранения совсем не такой... Вообще, я выразился неверно. Я хотел сказать, что в decimal ты не сможешь записать число с потерей точности, в отличие от double, по причине, указанной тобой же.
Re[3]: Точность С#
От: Oyster Украина https://github.com/devoyster
Дата: 10.04.06 21:15
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Увы это не пройдет, т.к я ищу их в Hashtable как ключи и получаю Null из-за этой погрешности((


Пройдёт — для Hashtable можно указать свой IEqualityComparer.

MAP>Тогда раз так не проходит у меня возник такой вопрос: Порядок Hashtable Keys соответствует порядку Hashtable.Values? в Java нет, а тут?


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

MAP>P.s Неужели выч техника на столько не точная??


В каком смысле "вычислительная техника настолько неточная"? Скорее, нам не всегда хочется сохранять точность засчёт потери скорости или памяти, и double это как раз такой случай. Хочется точности — юзай decimal или какой-то рукописный класс.
Re[3]: Точность С#
От: WolfHound  
Дата: 10.04.06 22:32
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Увы это не пройдет, т.к я ищу их в Hashtable как ключи и получаю Null из-за этой погрешности((

Если тебе надо 1.1 то
public Hashtable (
    IHashCodeProvider hcp,
    IComparer comparer
)

Если 2.0 то
public Hashtable (
    IEqualityComparer equalityComparer
)

И сравниваешь с учетом погрешности. С хеш кодом тоже что-то придется придумать.

MAP>Тогда раз так не проходит у меня возник такой вопрос: Порядок Hashtable Keys соответствует порядку Hashtable.Values? в Java нет, а тут?

См DictionaryEntry
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.