Чтобы избавиться от тибурского if, вы можете получить небольшое улучшение, используя дешевый (er) mul + float cast
y = x ^ u
y.z += float(y==0); // this changes a zero-vector into (0,0,1)
z = x ^ y
Выполнение векторного сравнения после перекрестного продукта дает более стабильное решение, чем проверка, если u == x, приведение с плавающей запятой зависит от вашей архитектуры, но работает на большинстве компиляторов / платформ.
По существу, этот вид базовой функции всегда будет иметь особенность, когда x совмещен с u, поэтому постарайтесь разумно выбрать u из контекста, помните, что u не обязательно должно быть константой. В большинстве случаев вы можете выбрать u для совпадения с тривиальным случаем, чтобы сгладить сингулярность и сохранить общее преобразование стабильным.