Нормализация вектора C++ / Java

Здравствуйте.
Писал тут тестовую программку на Java и наткнулся на странную вещь. Вычисления какие-то неправильные. Оказалось, что проблема в нормализации вектора.
Я всегда думал (в интернете везде так написано), что вектор нормализуется как-то так:


    public Vec3 normalize() {
        double length = x * x + y * y + z * z;
        if (Math.abs(length) >= 0.001) {
            return new Vec3(x / length, y / length, z / length);
        }
        return new Vec3(x, y, z);
    }

Если

        Vec3 v = new Vec3(1.0, 0.0, -1.0);
        Vec3 vn = v.normalize();

то получается [x=0.5 y=0.0 z=-0.5]. Но это неправильно! Дальнейшие вычисления идут по трубе.
Переписал код на C++:


    glm::vec3 v{ 1.0f, 0.0f, -1.0f };
    glm::vec3 vn = glm::normalize(v);

Получается [x=0.7071... y=0.0 z=-0.7071...] и дальше правильно вычисляется. Хотя, целиком программу не переписывал и не уверен, что всё остальное тоже было бы правильно.
Но что за прикол с нормализацией? Как тогда нормализуется вектор?
Собственно, проблема в следующем. Если два вектора направлены друг на друга, то их dot product должен быть равен единице. Или минус единице, если они направлены в разные стороны. Если вычислять через GLM - так и есть. А если нормализировать вектор вручную (как написано в интернете), то фигня какая-то получается :thinking:

ЧОРТ :imp:
Я квадратный корень забыл извлечь :man_facepalming: Код по памяти писал, не копипастил.

       double length = Math.sqrt(x * x + y * y + z * z);

Лошара же