Сравнение int с decimal на больше-меньше.
От: Аноним  
Дата: 09.09.09 10:44
Оценка:
Привет.

Столкнулся с небольшой проблемкой...
Есть переменная "data" типа decimal, которая содержит некоторое расчётное число.
Есть 2 int переменные, задающие диапазон. — Напимер "min" и "max".
Надо определить попадает ли "data" в диапазон "min"..."max".

Как сравнить 2 вещественых числа на равенство мне ясно — взять модуль от разницы и сравнить с заданной точностью.
А как сравнивать вещественые числа на больше-меньше?

Есть идея округлить data до целого числа с помощью Math.Round, например.
Но Math.Round вернёт тоже вещественное число... — т.е. это мне ничего не даст...

Тема не новая, но что-то гуглил-гуглил и не нашёл
Поможете?
Сенкс.
Re: Сравнение int с decimal на больше-меньше.
От: SaZ  
Дата: 09.09.09 11:15
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Привет.

...
А>Тема не новая, но что-то гуглил-гуглил и не нашёл
А>Поможете?
А>Сенкс.

А если просто сравнивать?
Re: Сравнение int с decimal на больше-меньше.
От: MozgC США http://nightcoder.livejournal.com
Дата: 09.09.09 11:35
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Как сравнить 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 — из-за машинной точности числа.
В этом случае условие выполнено не будет.
Re[2]: Сравнение int с decimal на больше-меньше.
От: hexamino http://hexamino.blogspot.com/
Дата: 09.09.09 11:41
Оценка: -1
Здравствуйте, 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 в БД.
Т.е. мне кажется надёжней было б сравнивать с заданной точностью. Как?
Re[3]: Сравнение int с decimal на больше-меньше.
От: HowardLovekraft  
Дата: 09.09.09 11:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня он имеет тип decimal потому что он такой в БД. Есть маленькая вероятность, что при расчётах результат был double, а потом этот результат сохранили как decimal в БД.

Так в БД все равно хранится значение с фиксированной точкой. Какая вам разница, какой тип оно имело в "предыдущей жизни"?
Re[3]: Сравнение int с decimal на больше-меньше.
От: hexamino http://hexamino.blogspot.com/
Дата: 09.09.09 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Предположим 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>Если у тебя приближенные вычисления, то ты можешь получить неточный ответ, и от этого никуда не денешься.


При вычислениях с плавающей запятой ответ практически всегда будет не точен. Но он будет корректен до точности вычислений... — т.е. точен до какого-то знака после запятой.
Re[5]: Сравнение int с decimal на больше-меньше.
От: HowardLovekraft  
Дата: 09.09.09 12:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Но всё же любопытно — как сравнивать вещественые числа на больше-меньше с заданной точностью?


|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 ?
Re[7]: Сравнение int с decimal на больше-меньше.
От: MozgC США http://nightcoder.livejournal.com
Дата: 09.09.09 12:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как быть, если мне надо сравнить float1 < float2 с точностью delta ?

float2 — float1 > delta
Re[8]: Сравнение int с decimal на больше-меньше.
От: hexamino http://hexamino.blogspot.com/
Дата: 09.09.09 12:41
Оценка:
Здравствуйте, 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 ?



Вот-вот — и я о том же. Непонятно-ж
Re[9]: Сравнение int с decimal на больше-меньше.
От: MozgC США http://nightcoder.livejournal.com
Дата: 09.09.09 12:52
Оценка:
Здравствуйте, hexamino, Вы писали:

А>>>А как быть, если мне надо сравнить float1 < float2 с точностью delta ?

MC>>float2 — float1 > delta
H>А может быть, float2 — float1 > -delta ?

Почему? Если foat2 — float1 > delta, то float1 действительно меньше float2. А причем тут -delta?
Re[10]: Сравнение int с decimal на больше-меньше.
От: hexamino http://hexamino.blogspot.com/
Дата: 09.09.09 13:02
Оценка: 8 (1) +1
Здравствуйте, MozgC, Вы писали:

А>>>>А как быть, если мне надо сравнить float1 < float2 с точностью delta ?

MC>>>float2 — float1 > delta
H>>А может быть, float2 — float1 > -delta ?

MC>Почему? Если foat2 — float1 > delta, то float1 действительно меньше float2. А причем тут -delta?


При том, что при вычислении операндов погрешность могла быть допущена в любую сторону.
Re[6]: Сравнение int с decimal на больше-меньше.
От: TK Лес кывт.рф
Дата: 09.09.09 13:20
Оценка: +1
Здравствуйте, HowardLovekraft, Вы писали:

HL>|float1 — float2| < delta,

HL>где delta — желаемая точность.

Главное, еще эту самую дельте опредилить — константа тут явно не подойдет...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[5]: Сравнение int с decimal на больше-меньше.
От: Аноним  
Дата: 09.09.09 16:09
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Но всё же любопытно — как сравнивать вещественые числа на больше-меньше с заданной точностью?
Можно сравнивать на "меньше или равно", где проверку на равенство определять через дельту
Re: Сравнение int с decimal на больше-меньше.
От: Pavel Dvorkin Россия  
Дата: 10.09.09 05:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А как сравнивать вещественые числа на больше-меньше?


Задача не совсем корректно поставлена. Если сравнивать абстрактные вещественные числа на больше-меньше, то да, просто в лоб. Но в реальности эти вещественные числа обычно есть некие данные, взятые из внешнего мира (или полученные из этих внешних даных). И если это так, то надо определить, что такое больше или меньше — с учетом точности этих данных.

Взвесили на весах пакет картошки. Получили 1030 г. Взвесили другой — 1040 г. Верно, что второй больше ? Ответ — пока мы не знаем точности весов, ничего сказать нельзя. Если их точность 1 грамм — верно. Если их точность 50 г — неверно.
Более того, даже если их точность 1 г, это может считаться неверным, потому что мы так хотим. Например, для нас по смыслу задачи такие отличия не являются значимыми, и мы хотим считать эти 2 пакета имеющими одинаковый вес. Вот если на 100 г отличаются — тогда будем считать их разными.

Так что надо решать применительно к конкретной задаче.
With best regards
Pavel Dvorkin
Re[9]: Сравнение int с decimal на больше-меньше.
От: Sinclair Россия https://github.com/evilguest/
Дата: 10.09.09 06:10
Оценка: :)
Здравствуйте, 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>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.