Сравнение даблов (java, но эт наверна ко многих языкам отн.)
Судя по коду
public int CompareTo(double value)
{
if (this < value)
{
return -1;
}
if (this > value)
{
return 1;
}
if (this != value)
{
if (!IsNaN(this
{
return 1;
}
if (!IsNaN(value
{
return -1;
}
}
return 0;
}
1. либо даблы можно сравнивать через ==
2. либо этот метод делает не то, что мы ожидаем.
Имхо, первое.
он даже еще больше суров
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1; // (0.0, -0.0) or (NaN, !NaN)
.NET есть метод Double.CompareTo.это другой compare, это compare на больше/меньшей
Судя по коду
а botwi нужен на самом деле Equals(v1, v2, eps а не compare
но при парсинге строки вроде как вычислений быть не может...
вот токо если тот кто писал в строку записал число как 1.999999999999999
то при распарсенье строки это двойкой не станет...
это другой compare, это compare на больше/меньшейне соглашусь
а botwi нужен на самом деле Equals(v1, v2, eps а не compare
этот компаре из той же серии
смысл в том что я боюсь: что если один дабл меньше другого то не факт что они не равны
это другой compare, это compare на больше/меньшейлибо равно , да тот это compare
вот токо если тот кто писал в строку записал число как 1.999999999999999это не станет, а если добавить еще две 9-ки то станет
то при распарсенье строки это двойкой не станет...
Если ничего про точность не сказано, то лучше сравнивать на равно. Но после того, как сделаны вычисления, уже на равно не имеем право.
Вот так меня учили.
А эти все CompareTo тут вообще не в кассу, они введены из соображений реализации интерфейса IComparable (это для .NET и то, если правильно помню: давно не писал)
они введены из соображений реализации интерфейса IComparableи чё? смысл этого интерфейса как раз и есть — сравнение
и чё? смысл этого интерфейса как раз и есть — сравнениесравнивать на больше меньше с точностью до eps - в целом бессмыслено.
потому что тогда, например, при сортировке можно запросто получить такой порядок
1.0, 1.2, 1.15, 1.1, 1.3
при eps - 0.06
при сортировке можно запросто получить такой порядоки почему это лишено смысла?
1.0, 1.2, 1.15, 1.1, 1.3
при eps - 0.1
Update: Для тебя же имееn смысл "1.17 и 1.2 равны при eps - 0.1"
сравнивать на больше меньше с точностью до eps - в целом бессмыслено.Ещё и потому, что сортировщики всё-таки рассчитывают, что отношение равенства транзитивно. Если a=b и b=c, но a!=c - как-то совсем грустно выходит для сортировки, с некоторыми алгоритмами (работающими быстрее, чем за O(n^2 можно получить и порядок, когда 1.3 будет идти до 1.0.
Сомневаюсь, что ты понимаешь зачем действительно нужны интерфейсы в этом языке (да и вообще как часть объектно-ориентированной парадигмы)
о круто, до чего добрались . И зачем же они нужны?
С другой стороны, так же никогда не стоит сравнивать на равно вещественные числа, полученные хоть сколько-нибудь простыми вычислениями.
Я тут, естественно, не говорю о случаях, когда это неправильное поведение является хитрым хаком при решении какой-нибудь задачи, там все средства хороши (хотя с ходу ни одной такой задачи придумать не могу, напишите, если будут идеи).
А вообще все это изучается еще в школе.
о круто, до чего добрались . И зачем же они нужны?давай так. лучше, чем я тебе буду читать лекцию о том, зачем нужны вообще интерфейсы, ты лучше скажешь, зачем нужен IComparable (можешь еще упомянуть IComparable<T> для полноты картины а я тебя поправлю.
Если a=b и b=c, но a!=c - как-то совсем грустнокхм, это, конечно, ценное замечание, но оно, как раз, показывает необычность операции сравнения на равно , а цитируешь и соглашаешься ты с тем, что бессмыслена операция на сравнение больше/меньше
Под сравнением "на равно" понимаются сравнения вида
a == bв противоположность сравнениям вида
a < b
a <= b
a > b
a >= b
abs(a-b) < eps
a < b - eps
a < b + eps
a > b + eps
a > b - eps
Так вот последние стоит использовать чаще.
Сформулирую следующим образом: если не принято решение, что без эпсилон будет работать, то надо сравнивать в эпсилон.
лучше, чем я тебе буду читать лекцию о том, зачем нужны вообще интерфейсыок, лекцию не надо, но расскажи где в моих постах несогласованность с понятием интерфейса в парадигме ООП?
ты лучше скажешь, зачем нужен IComparable (можешь еще упомянуть IComparable<T> для полноты картины а я тебя поправлю
посмотри в MSDN
и почему это лишено смысла?лишено смысла при eps 0.06
про eps - 0.1 описался
и почему это лишено смысла?Это он тебя пожалел просто.
Update: Для тебя же имееn смысл "1.17 и 1.2 равны при eps - 0.1"
Надо такой пример:
100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
При eps = 1.5, да хоть 5
Я вам больше скажу: при eps=+Inf все даблы равны, и непонятно, хуле мы тут спорим, лучше водки выпить.
Надеюсь, ты шутишь по поводу eps=+inf.
лишено смысла при eps 0.06почему?
посмотри в MSDNя как раз его в свое время прочитал. И спецификацию прочитал. И понял.
upd/ессно, не весь, а что касается языка
Ладно. В общем по поводу
расскажи где в моих постах несогласованность с понятием интерфейса в парадигме ООПтам нет несогласованности, а я этого не утверждал, я сказал лишь, что после прочтения твоих постов у меня возникает сомнение том, что у тебя правильное понятие присутствует. А именно
из твоего выражения
и чё? смысл этого интерфейса как раз и есть — сравнениеТак вот, смысл интерфейса — это никак не выполнение каких-либо действий, как раз наоборот, он лишь описывает, как можно обращаться с объектом. Далее, конкретно для IComparable. Он нужен для выполнения алгоритмов и работы структур данных, подразумевающих наличие некоторого отношения упорядоченности на подконтрольном множестве. И нет никаких предпосылок усложнять реализацию этого интерфейса по умолчанию для числа типа Double, вводя (к тому же нетранзитивную, как указал penartur) и усложненную операцию.
почему?прочитай уже мой пример, он методологически более удачен.
Так вот, смысл интерфейса — это никак не выполнение каких-либо действий, как раз наоборот, он лишь описывает, как можно обращаться с объектом.ну как бы весь текст программы это не выполнение каких-либо действий, лишь описание . Ты начал придираться, я тоже .
И нет никаких предпосылок усложнять реализацию этого интерфейса по умолчанию для числа типа Double, вводя (к тому же нетранзитивную, как указал penartur) и усложненную операцию.
ну ты же сам писал
Так вот последние стоит использовать чаще.
А теперь вдруг никаких предпосылок
ну ты же сам писалЕсли ты не понимаешь этих двух вещей вместе, то тебе еще многому предстоит научиться. Если ты не понимаешь необходимости этому учиться, то уже поздно. Надеюсь, программирование для тебя - это лишь хобби. Хотя, мне это не очень интересно. Топикстартеру мы тут ответили как могли. Он выводы сделает. Тебе могу посоветовать сначала прочитать побольше книжечек, а потом начинать изливать свои размышления здесь.
Так вот последние стоит использовать чаще.А теперь вдруг никаких предпосылок
почему?потому что при esp 0.06
у тебя ранее появляется число 1.2 которое уж точно больше (даже с точностью до eps чем 1.1 которое появляется позже.
А теперь вдруг никаких предпосылокиз пожелания "мир во всем мира" совсем не следует, что есть какие-то реальные пути это обеспечить.
также из пожелания "использовать чаще" не появляется понимание "а как это вообще можно сделать"
у тебя ранее появляется число 1.2 которое уж точно больше (даже с точностью до eps чем 1.1 которое появляется позже.а почему оно там появилось? потому что ты сравнил не все числа друг с другом? т.е. дело в алгоритме?
а почему оно там появилось? потому что ты сравнил не все числа друг с другом? т.е. дело в алгоритме?да, на самом деле, дело в алгоритме
т.к. нельзя использовать штатные сортировки, а надо использовать так называемую топологическую сортировку
если сравнивать все числа друг с другом, то об эффективном алгоритме сортировки не может быть и речи.
кхм, это, конечно, ценное замечание, но оно, как раз, показывает необычность операции сравнения на равно , а цитируешь и соглашаешься ты с тем, что бессмыслена операция на сравнение больше/меньшеКак, по-твоему, работает сортировка? При встрече двух равных элементов программа говорит пользователю "фу, не делай так больше"?
а почему оно там появилось? потому что ты сравнил не все числа друг с другом? т.е. дело в алгоритме?Штоб
Оставить комментарий
pitrik2
даблы приходят из разных библиотектудыть они попадают из строк, как они там внутри строки парсят неизвестно
точность их - 4 знака после запятой
вопрос собсна такой, можно ли их сравнивать через == ?
или для сравнения даблов всегда нада юзать машинный эпсилон?
экспилон тут я так понимаю достаточно использовать 10e-5 ?
если всегда, то блин, почему нет стандартной функции compare(double, double, eps)?
в джава 1.6 добавили машинную эпсилон, но функц. compare нету, и ведь даже в commons ее нету