Это даже хуже, чем предлагает Ювал.
Математически, для заданного вектора x вы ищете новый вектор x / || x ||
где ||. || это норма, о которой вы, вероятно, думаете как о евклидовой норме с
|| ||. = sqrt (точка (v, v)) = sqrt (сумма_i x_i ** 2)
Это числа с плавающей запятой, поэтому недостаточно просто защититься от деления на ноль, у вас также есть проблема с плавающей запятой, если x_i все маленькие (они могут снизиться, и вы потеряете величину).
По сути, все сводится к тому, что если вам действительно нужно уметь правильно обрабатывать небольшие векторы, вам придется проделать еще некоторую работу.
Если малые и нулевые векторы не имеют смысла в вашем приложении, вы можете проверить величину вектора и сделать что-то подходящее.
(обратите внимание, что как только вы начинаете работать с числами с плавающей запятой, а не с действительными числами, делать такие вещи, как возведение в квадрат, а затем квадратные числа с корнем (или их суммы) становится проблематичным как для больших, так и для малых концов представимого диапазона )
Итог: правильно выполнять числовую работу во всех случаях сложнее, чем кажется на первый взгляд.
Например, с головы до головы потенциальные проблемы с этой (нормализацией) операцией, выполненной наивным способом
- все компоненты (x_i) слишком малы
- любой слишком большой компонент (выше квадратного корня из представимого max) вернет бесконечность. Это сокращает доступные величины компонентно на sqrt.
- если отношение большого компонента к маленькому компоненту слишком велико, вы можете эффективно потерять направление мелких компонентов, если не будете осторожны
- и т.д..