-
Как сравнить 2 double? На равенство и неравенство?
Учитывая, что хочется универсального метода для неизвестного порядка сравниваемых величин, т.е. сравнение вроде
abs(d1 - d2) < eps
упирается в выбор eps, с чем легко пролететь как показывает практика. Кроме всего прочего так же крайне интересуют скоростные характеристики.
Хотелось бы выведать кто чего знает по этому вопросу.
-
Кнут. 2 том. 4 глава.
-
Math.SameValue
-
> KSergey © (17.11.08 06:18)
> упирается в выбор eps
Погуглите термины "машинный ноль" и "машинное эпсилон". Сильно поможет в автоматическом выборе eps.
-
А в чем проблема с выбором эпс? Несколько раз так писал, для конкретной задачи всегда было ясно, какое число есть очень маленькое.
-
Сравнение вещественных числе обычно применяется в физических задачах. А там eps определяется постановкой (ну зачем, например, космический корабль сажать с точностью до миллиметра, или рассчитывать прочность до грамм для нескольких тонн). Так что спустись с небес теории на грешную землю практики и не будет возникать таких вопросов;)
-
> Рамиль © (17.11.08 08:57) [5]
Это как бы хорошо, но вот при вычислении корня из отрицательного числа возникает неприятное. И что с того, что число получившееся лишь физически незначительно отличалось от 0? Например.
-
> Это как бы хорошо, но вот при вычислении корня из отрицательного
> числа возникает неприятное.
В смысле? Вообще то, если попробовать вычислить корень из отрицательного, получим runtime error.
-
> Рамиль © (17.11.08 09:30) [7]
Вот именно. Получим. То есть получим существенно иное поведение при почти равных числах.
Ну и при дрейфе можем в итоге насчитать разное, что мимио Луны сядем. :) Воспрос не праздный как раз для практики ведь.
-
> Дуб © (17.11.08 09:34) [8]
А, понял. Но тут тоже надо индивидуально подходить. Проверять надо:) И тут все равно eps согласно задаче (или, для ленивых, возвести в квадрат)
-
При физических расчетах обычно eps ~= погрешности измерений...
-
Стандартно опеределенные esp:
const
FuzzFactor = 1000;
ExtendedResolution = 1E-19 * FuzzFactor;
DoubleResolution = 1E-15 * FuzzFactor;
SingleResolution = 1E-7 * FuzzFactor;
-
Без приложения к конкретной предметной области сабж и впрям глуп
-
> Jeer © (17.11.08 10:12) [11]
> Стандартно опеределенные esp:
Не не, только не стандартные, проходили.
> MsGuns © (17.11.08 11:38) [12]
> Без приложения к конкретной предметной области сабж и впрям глуп
хотелось совершенно универсального решения... Вдруг оно есть, а я о том не знаю? :)
Спасибо ответившим, изучаю.
-
> Ну и при дрейфе можем в итоге насчитать разное, что мимио
> Луны сядем. :)
Зачем Луна? Пункты приема металлолома на Марсе.
-
> KilkennyCat © (17.11.08 12:34) [14]
Ну, мы то свой металлолом пека только на Луне продали.
-
> KilkennyCat (17.11.2008 12:34:14) [14]
Только в Фобос не попади.
-