double и в Африке double. И если в вашем коде есть нечто вроде if (b! = 0) {result = a / b} это свидетельствует не о проблеме языка программирования, а о проблеме реализации.
Для b == 0, a / b == INF, что соответствует реальности, поэтому не вижу никаких неточностей со стороны языка программирования. Что вы называете тогда нормальным языком программирования?
Большинство программистов даже зная как устроен дабл будут допускать подобные ошибки. И проблема совсем в другом — в понимании. А дабл нужно понимать как 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. Вы думаете каждый программист без соответствующего мат. образования может выполнить такой анализ?
Для b == 0, a / b == INF, что соответствует реальности, поэтому не вижу никаких неточностей со стороны языка программирования. Что вы называете тогда нормальным языком программирования?
r(x1 * x1) у вас тоже 3 * 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. Вы думаете каждый программист без соответствующего мат. образования может выполнить такой анализ?