JuliaStats / Statistics.jl

The Statistics stdlib that ships with Julia.
https://juliastats.org/Statistics.jl/dev/
Other
71 stars 40 forks source link

Public API corresponding to `_mean_promote` #165

Open kimikage opened 5 months ago

kimikage commented 5 months ago

There has already been some discussion about the implementation of mean (and functions relying on it) so far, and there are still related issues open.

This issue concerns the behavior of mean with respect to types defined in other packages. An example case is FixedPointNumbers.jl, but this issue should not be specific to it.

https://github.com/JuliaStats/Statistics.jl/pull/25 changed the behavior of mean with FixedPoint. Briefly, it accumulates the sum with the intermediate type Float32, which was formerly Float64. Therefore, FixedPointNumbers has added a workaround method definitions as below (cf. https://github.com/JuliaMath/FixedPointNumbers.jl/pull/183):

Statistics._mean_promote(x::Real, y::FixedPoint) = Float64(y)

The workaround has worked well so far, but we do not know about that in the future. The lack of a public API corresponding to _mean_promote is a real problem, especially since Statistics.jl is now an upgradable stdlib.

Ideally, it would be better to have the ability to promote types in three separate steps: initialization, body (i.e., the current _mean_promote), and finalization. Currently, in the accumulation, the inefficient conversion of fixed-point numbers to floating-point numbers runs. We should be able to accumulate the sum in fixed-point numbers and finally convert it to a useful floating-point number (Float64).

kimikage commented 5 months ago

Of course, there is also the option of extending public APIs, such as mean. But that will not work well with collections containing different types defined in different packages.