Don wrote:
Lars T. Kyllingstad wrote:
Don wrote:
bearophile wrote:
So far I've just given a light reading of the code. Notes:

- pow(x, 2) and sqrt(y) can be written as x ^^ 2 and y ^^ 0.5 (but you have to import std.math anyway, because of a bug).

That's not a bug. It's intentional. x ^^ y will probably always require import std.math, if y is a floating point number.

Really? Why is that? I find that kind of disappointing, I always believed it to be a temporary solution.

I think the inconsistency with the other operators will make this a major WTF for people new to the language. Why should a^^b require an explicit import while a*b doesn't?

Because pow() for floating point, when implemented properly, is a HUGE function, that ends up dragging almost all of std.math into the executable. And I think it's deceptive to do that silently. To make it completely built-in, basically all of std.math would need to be moved into druntime. Feel free to try to change my mind, of course.

Exponentiation is a built-in operation in FORTRAN, so I made this little program to check:

      program test

      implicit none
      real  :: base, expo, pow

      write (*,*) "Base:"
      read  (*,*) base
      write (*,*) "Exponent:"
      read  (*,*) expo

      pow = base**expo
      write (*,*) pow

      end program test

The produced executable is 11K. If I replace exponentiation with multiplication, it is still 11K. Why wouldn't the same be possible in D?

Note that I'm not trying to argue with you, I am sure you know what you're talking about. I know very little of what's going on under the hood of either compiler, so I'm asking out of curiosity.


If the language made it possible to overload operators using free functions, I wouldn't mind if opBinary!"^^"(float, float) was implemented in std.math. The way it is now, it's a halfway built-in, halfway library feature, and just seems halfway altogether.

You can expect the integration to become cleaner; still, it's a compromise. It was a big fight to get it into the language at all, and I've tried to minimize the cost of it. ^^ is basically syntax sugar, and the price you pay for the additional tiny bit of syntax sugar (avoiding import std.math) has an appalling cost-benefit ratio.

Raising to a float power is really a niche feature. Are there really many uses for ^^ of floats, where std.math isn't imported already (for example, where you don't even use abs()) ?

It's the inconsistency with the other operations on built-in types that bothers me, not the hassle of writing 'import std.math'.

But please don't get me wrong, I absolutely prefer the current solution over nothing. Now that I've gotten used to it I'm never going back. :)

For fun I grepped my numerics library for uses of ^^, and found I've used it >65 times (65 is the line count, and it's used twice in some lines). And let it be known that the majority of the cases are float^^float! ;)

-Lars

Reply via email to