GHC handles badly with math formulas

I've noted several times that GHC doesn't evaluate formulas for Double values during compilation. That is using 4.2326514735445615 instead of (512 / 0.844)**(1/3) or 0.906179845938664 instead of (1/3) * sqrt(5 + 2 * sqrt(10 / 7)) This can lead to significant slowdown if such values are called often. It's not always convenient to use where or let to reduce the number of calculations of such constants so I wonder how to force GHC to evaluate them during compilation?

On Monday 13 June 2011, 17:46:23, Grigory Sarnitskiy wrote:
I've noted several times that GHC doesn't evaluate formulas for Double values during compilation.
That is using 4.2326514735445615 instead of (512 / 0.844)**(1/3) or 0.906179845938664 instead of (1/3) * sqrt(5 + 2 * sqrt(10 / 7))
This can lead to significant slowdown if such values are called often. It's not always convenient to use where or let to reduce the number of calculations of such constants so I wonder how to force GHC to evaluate them during compilation?

On Mon, 2011-06-13 at 19:46 +0400, Grigory Sarnitskiy wrote:
I've noted several times that GHC doesn't evaluate formulas for Double values during compilation.
That is using 4.2326514735445615 instead of (512 / 0.844)**(1/3) or 0.906179845938664 instead of (1/3) * sqrt(5 + 2 * sqrt(10 / 7))
Yep, looks that way. It's the square roots and powers that GHC is not applying. Where you've got divisions between constants, those are getting applied at compile time.
This can lead to significant slowdown if such values are called often.
If you assign them to a global name, then lazy evaluation will take care of it. It looks like GHC is even throwing in a specialization for Double when I give the global name a polymorphic type. -- Chris Smith
participants (3)
-
Chris Smith
-
Daniel Fischer
-
Grigory Sarnitskiy