Single-pass Pearson correlation is numerically unstable, so use double-precision