Hi,
I’m afraid it is indeed a problem of numerical precision of floating point numbers   The problem here is mostly that the dimension you reduce over (178741) is big enough that all the very small errors made by each individual op build up to something that is visible at the end. Also keep in mind that floating point numbers have only 6 significant digits. So anything smaller than 1e-6 here would be “noise”. With double precision, you can expect 1e-11.
If you do need more precision, double precision numbers are the way to go indeed.
Note though that it will be significantly slower to perform computation in double precision on GPU.