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]));
}
Здравствуйте, MAPCUAHUH, Вы писали:
MAP>Как увеличить точность прибавления 0.2????
Да никак — это вечная история с float-ами, и не только на C#. Невозможно всегда хранить мантиссу точно — из-за этого и возникает погрешность. Могу предложить сравнивать float-ы не напрямую с помощью ==, а смотреть, входит ли их разность в некоторый малый диапазон — тоже стандартный подход. Ну или использовать числа с фиксированной точкой — такие, как decimal, например, — если диапазона хватает.
Здравствуйте, 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.
Здравствуйте, 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 Знаю что неоптимально, но зато решит проблему с погрешностями.
Здравствуйте, 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.
Странно. По ссылке написано: 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).
Здравствуйте, Ice Dragon, Вы писали:
ID>Он не с фиксированной, а с плавающей, просто мантисса имеет основанием 10, а не 2.
Ну и формат хранения совсем не такой... Вообще, я выразился неверно. Я хотел сказать, что в decimal ты не сможешь записать число с потерей точности, в отличие от double, по причине, указанной тобой же.
Здравствуйте, MAPCUAHUH, Вы писали:
MAP>Увы это не пройдет, т.к я ищу их в Hashtable как ключи и получаю Null из-за этой погрешности((
Пройдёт — для Hashtable можно указать свой IEqualityComparer.
MAP>Тогда раз так не проходит у меня возник такой вопрос: Порядок Hashtable Keys соответствует порядку Hashtable.Values? в Java нет, а тут?
Тут тоже. Это же хеш-таблица, она заточена под быстрый поиск по ключу, а не под какое-то специальное упорядочивание ключей и значений.
MAP>P.s Неужели выч техника на столько не точная??
В каком смысле "вычислительная техника настолько неточная"? Скорее, нам не всегда хочется сохранять точность засчёт потери скорости или памяти, и double это как раз такой случай. Хочется точности — юзай decimal или какой-то рукописный класс.
Здравствуйте, 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) А. Эйнштейн