Столкнулся с небольшой проблемкой...
Есть переменная "data" типа decimal, которая содержит некоторое расчётное число.
Есть 2 int переменные, задающие диапазон. — Напимер "min" и "max".
Надо определить попадает ли "data" в диапазон "min"..."max".
Как сравнить 2 вещественых числа на равенство мне ясно — взять модуль от разницы и сравнить с заданной точностью.
А как сравнивать вещественые числа на больше-меньше?
Есть идея округлить data до целого числа с помощью Math.Round, например.
Но Math.Round вернёт тоже вещественное число... — т.е. это мне ничего не даст...
Тема не новая, но что-то гуглил-гуглил и не нашёл
Поможете?
Сенкс.
Здравствуйте, Аноним, Вы писали:
А>Как сравнить 2 вещественых числа на равенство мне ясно — взять модуль от разницы и сравнить с заданной точностью.
Это нужно при использовании типов данных float и double, а у вас decimal.
А>А как сравнивать вещественые числа на больше-меньше?
В случае decimal сравнивать в лоб.
Re[2]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 11:39
Оценка:
Здравствуйте, SaZ, Вы писали:
SaZ>А если просто сравнивать?
Что-то типа:
if (data <= max && data >= min)
{
// в диапазоне!
}
Это будет корректно работать в .net во всех случаях?
Сомневаюсь.
Предположим min = 1
Предположим, что в результате расчётов data должна быть равна 1, но практике data = 0.9999999999999 — из-за машинной точности числа.
В этом случае условие выполнено не будет.
Здравствуйте, MozgC, Вы писали:
MC>Здравствуйте, Аноним, Вы писали:
А>>Как сравнить 2 вещественых числа на равенство мне ясно — взять модуль от разницы и сравнить с заданной точностью. MC>Это нужно при использовании типов данных float и double, а у вас decimal.
Отличие decimal от double в том, что числа, представимые конечной десятичной дробью, будут представлены типом decimal точно. Однако, это совсем не гарантирует, что все операции с таким числом дадут точный, а не приближенный результат.
Re[2]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 11:47
Оценка:
Здравствуйте, MozgC, Вы писали:
MC>Здравствуйте, Аноним, Вы писали:
А>>Как сравнить 2 вещественых числа на равенство мне ясно — взять модуль от разницы и сравнить с заданной точностью. MC>Это нужно при использовании типов данных float и double, а у вас decimal.
А>>А как сравнивать вещественые числа на больше-меньше? MC>В случае decimal сравнивать в лоб.
ммм...
Тогда вопрос:
А как сравнивать вещественые числа на больше-меньше с заданной точностью?
Просто значения data берутся мной из БД, куда они помещаются другой программой. Я точно знаю что data — это расчётное значение. У меня он имеет тип decimal потому что он такой в БД. Есть маленькая вероятность, что при расчётах результат был double, а потом этот результат сохранили как decimal в БД.
Т.е. мне кажется надёжней было б сравнивать с заданной точностью. Как?
Здравствуйте, Аноним, Вы писали:
А>У меня он имеет тип decimal потому что он такой в БД. Есть маленькая вероятность, что при расчётах результат был double, а потом этот результат сохранили как decimal в БД.
Так в БД все равно хранится значение с фиксированной точкой. Какая вам разница, какой тип оно имело в "предыдущей жизни"?
Здравствуйте, Аноним, Вы писали:
А>Предположим min = 1 А>Предположим, что в результате расчётов data должна быть равна 1, но практике data = 0.9999999999999 — из-за машинной точности числа. А>В этом случае условие выполнено не будет.
Если у тебя приближенные вычисления, то ты можешь получить неточный ответ, и от этого никуда не денешься.
Re[4]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 11:54
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:
HL>Так в БД все равно хранится значение с фиксированной точкой. Какая вам разница, какой тип оно имело в "предыдущей жизни"?
ok.
Но всё же любопытно — как сравнивать вещественые числа на больше-меньше с заданной точностью?
Re[4]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 12:03
Оценка:
Здравствуйте, hexamino, Вы писали:
H>Если у тебя приближенные вычисления, то ты можешь получить неточный ответ, и от этого никуда не денешься.
При вычислениях с плавающей запятой ответ практически всегда будет не точен. Но он будет корректен до точности вычислений... — т.е. точен до какого-то знака после запятой.
Здравствуйте, Аноним, Вы писали:
А>Но всё же любопытно — как сравнивать вещественые числа на больше-меньше с заданной точностью?
|float1 — float2| < delta,
где delta — желаемая точность.
Re[6]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 12:32
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, Аноним, Вы писали:
А>>Но всё же любопытно — как сравнивать вещественые числа на больше-меньше с заданной точностью?
HL>|float1 — float2| < delta,
HL>где delta — желаемая точность.
Это сравнение на равенство — вместо float1 == float2 надо использовать |float1 — float2| < delta.
Это я знаю
А как быть, если мне надо сравнить float1 < float2 с точностью delta ?
Здравствуйте, MozgC, Вы писали:
MC>Здравствуйте, Аноним, Вы писали:
А>>А как быть, если мне надо сравнить float1 < float2 с точностью delta ? MC>float2 — float1 > delta
А может быть, float2 — float1 > -delta ?
Re[9]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 12:45
Оценка:
Здравствуйте, hexamino, Вы писали:
H>Здравствуйте, MozgC, Вы писали:
MC>>Здравствуйте, Аноним, Вы писали:
А>>>А как быть, если мне надо сравнить float1 < float2 с точностью delta ? MC>>float2 — float1 > delta
H>А может быть, float2 — float1 > -delta ?
Здравствуйте, hexamino, Вы писали:
А>>>А как быть, если мне надо сравнить float1 < float2 с точностью delta ? MC>>float2 — float1 > delta H>А может быть, float2 — float1 > -delta ?
Почему? Если foat2 — float1 > delta, то float1 действительно меньше float2. А причем тут -delta?
Здравствуйте, MozgC, Вы писали:
А>>>>А как быть, если мне надо сравнить float1 < float2 с точностью delta ? MC>>>float2 — float1 > delta H>>А может быть, float2 — float1 > -delta ?
MC>Почему? Если foat2 — float1 > delta, то float1 действительно меньше float2. А причем тут -delta?
При том, что при вычислении операндов погрешность могла быть допущена в любую сторону.
Главное, еще эту самую дельте опредилить — константа тут явно не подойдет...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Сравнение int с decimal на больше-меньше.
От:
Аноним
Дата:
09.09.09 16:09
Оценка:
Здравствуйте, Аноним, Вы писали: А>Но всё же любопытно — как сравнивать вещественые числа на больше-меньше с заданной точностью?
Можно сравнивать на "меньше или равно", где проверку на равенство определять через дельту
Здравствуйте, Аноним, Вы писали:
А>А как сравнивать вещественые числа на больше-меньше?
Задача не совсем корректно поставлена. Если сравнивать абстрактные вещественные числа на больше-меньше, то да, просто в лоб. Но в реальности эти вещественные числа обычно есть некие данные, взятые из внешнего мира (или полученные из этих внешних даных). И если это так, то надо определить, что такое больше или меньше — с учетом точности этих данных.
Взвесили на весах пакет картошки. Получили 1030 г. Взвесили другой — 1040 г. Верно, что второй больше ? Ответ — пока мы не знаем точности весов, ничего сказать нельзя. Если их точность 1 грамм — верно. Если их точность 50 г — неверно.
Более того, даже если их точность 1 г, это может считаться неверным, потому что мы так хотим. Например, для нас по смыслу задачи такие отличия не являются значимыми, и мы хотим считать эти 2 пакета имеющими одинаковый вес. Вот если на 100 г отличаются — тогда будем считать их разными.
Так что надо решать применительно к конкретной задаче.
Здравствуйте, hexamino, Вы писали: H>А может быть, float2 — float1 > -delta ?
Нет. Вот как это должно работать:
1. Вычисляем delta = float2 — float1.
2. Если бы у нас была точная арифметика, то по знаку delta мы бы судили о том, кто больше. А равенство достигалось бы при delta == 0.
3. Но у нас конечная точность, и мы моделируем это при помощи расширения "зоны нуля" в обе стороны на epsilon. То есть теперь при |delta| < epsilon мы считаем. что float1 == float2.
4. Ну так очевидными следствиями из этого являются:
4.1. float2 < float1 считается тогда, когда delta <= -epsilon
4.2. float2 > float2 cчитается тогда, когда delta >= +epsilon
Нарисуйте картинку и всё станет очевидно.
Еще, как упомянул ТК, можно ввести относительную точность, вместо абсолютной. Это когда epsilon выражается через |float2+float1|. В принципе, можно обойтись и одним из сравниваемых — любым, поскольку если они сильно отличаются, то и епсилон нам не важен.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.