Exponentiation operator precedence
sphink at gmail.com
Thu Aug 27 17:19:41 UTC 2015
On 08/27/2015 09:25 AM, Dean Tribble wrote:
> Ideally syntax proposals should include some frequency information to
> motivate any change. Is there an easy search to estimate the frequency
> of Math.pow? In my application codebase (financial app with only
> modest JS use), there are very few uses, and there are as many uses of
> Math.sin as there are of Math.pow.
Frequency relative to what, though? If code that does nontrivial math is
a very small proportion of total JS code, and yet the exponentiation
operator makes that code much more readable, then what is the
conclusion? I would argue that ** precedence confusion is irrelevant to
code that isn't going to use Math.pow in the first place. So it's a
question of whether ** is a big enough readability win in code that
> Anecdotally, my eyes caught on: "-Math.pow(2,-10*a/1)" (from a
> charting library) which makes me not want to have to review code where
> I'm worried about the precedence of exponentiation.
I'd have to write that out: -2**(-10*a/1). That doesn't seem too bad.
For myself, I do very much prefer Math.sqrt(a**2 + b**2) to
Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)). The verbosity and uneven
density of notation is really bothersome -- for any equation like the
second one, I guarantee that I'll rewrite it on paper to figure out what
it's saying. (Ok, maybe not for that specific formula, but even there
I'll mentally render it.) I would not need to do so with the first one.
Jumping between prefix and infix is jarring.
Then again, I could make the same argument for Math.sqrt(a**2 + b**2) vs
(a**2 + b**2) ** 0.5. And I don't like the second one much. But people
don't interchange those when handwriting formulas, either.
Math.sqrt(a.pow(2) + b.pow(2)) is an interesting middle point. I
initially thought it struck the right balance, but seeing it written
out, it still looks far inferior to me.
A more complex example might help:
a * (b - a)**(x - 1/2 * (b - a)**2)
a * Math.pow(b - a, x - 1/2 * Math.pow(b - a, 2))
a * (b - a).pow(x - 1/2 * (b - a).pow(2))
For me, the middle one is a mess. I can't make sense of it, and I can't
spot the common (b - a) expression at all. The first one is as readable
as such formulas ever are when written out with ASCII text. The third
one is somewhere in between. I can see the common (b - a), and perhaps
if I got more used to seeing .pow I could mentally make use of it
without writing it on paper, but for now I cannot. Part of the problem
is that I can easily translate "x**2" into "x squared", but "x.pow(2)"
is raising x to the power of 2.
More information about the es-discuss