All streams
Search
Write a publication
Pull to refresh
0
0
Send message
Вопрос к автору: «На какой машине проводились тесты?» Указывать тайминг без спецификации оборудования не очень корректно.
«Мопед не мой я просто разместил объяву...»
Чей алгоритм круче?
image
double и в Африке double. И если в вашем коде есть нечто вроде if (b! = 0) {result = a / b} это свидетельствует не о проблеме языка программирования, а о проблеме реализации.
Для b == 0, a / b == INF, что соответствует реальности, поэтому не вижу никаких неточностей со стороны языка программирования. Что вы называете тогда нормальным языком программирования?
В таком случае я не понимаю чем мой ответ отличается от ваших рассуждений. Относительная ошибка
r(x1 * x1) у вас тоже 3 * eps.
Поправка вместо min должен быть max, но суть таже.
Минуточку x1 * x1 и y1 * y1 строго больше нуля. Поетому r(x1 * x1 + y1 * y1) = min(r(x1*x1), r(y1*y1)) + eps = min(r(x1) + r(x1) + eps, r(y1) + r(y1) + eps) + eps = min(3*eps, 3*eps) + eps = 4*eps.
Большинство программистов даже зная как устроен дабл будут допускать подобные ошибки. И проблема совсем в другом — в понимании. А дабл нужно понимать как value + eps, где value то что вы хотели представить как double, а eps — относительная погрешность округления (машинное Эпсилон). Если взять пример автора и провести анализ относительных погрешностей:
r (x1) = r (y1) = r (x2) = r (y2) = eps,
r (x1 * x1 + y1 * y1) = r (x2 * x2 + y2 * y2) = 4 * eps,
r (len1) = r (len2) = 3 * eps,
r (x1 / len1) = r (y1 / len1) = r (x2 / len2) = r (y2 / len2) = 5 * eps,
r (dotProduct) = 12 * eps, если брать x1 * x2 и y1 * y2 одного знака как в примере автора.
Вот теперь понятно откуда берутся значения больше 1.0. Вы думаете каждый программист без соответствующего мат. образования может выполнить такой анализ?
Ограничение на длину блока равную К-1 важно только если искать сумму. Если же искать максимум, минимум можно разбивать и на К.
2

Information

Rating
Does not participate
Registered
Activity