in src/annoylib.h [571:586]
static inline T distance(const Node<S, T>* x, const Node<S, T>* y, int f) {
if (x->built || y->built) {
// When index is already built, we don't need angular distances to retrieve NNs
// Thus, we can return dot product scores itself
return -dot(x->v, y->v, f);
}
// Calculated by analogy with the angular case
T pp = x->norm ? x->norm : dot(x->v, x->v, f) + x->dot_factor * x->dot_factor;
T qq = y->norm ? y->norm : dot(y->v, y->v, f) + y->dot_factor * y->dot_factor;
T pq = dot(x->v, y->v, f) + x->dot_factor * y->dot_factor;
T ppqq = pp * qq;
if (ppqq > 0) return 2.0 - 2.0 * pq / sqrt(ppqq);
else return 2.0;
}