The documentation of the algorithm behind gluLookAt is partly wrong. See:
"s" needs to be normalized because it is used for rotation, not translation. Also other gluLookAt implementations do this. For instance see:
And also if "s" is normalized, there is no need to normalize UP anymore.
So "s" is computed this way:
tmp = f x UP
s = tmp || tmp ||
and UP' can be removed.