^^ implementation [Was: Re: Code speed]

Don nospam at nospam.com
Wed Apr 14 03:11:23 PDT 2010


bearophile wrote:
> Don:
> 
> Thank you for your answer and comments.
> 
>> 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.
> 
> I have just read the source of pow() and indeed it's a complex function that needs several other functions of math.

It's not even implemented correctly yet. A correct implementation is AT 
LEAST ten times larger.
> 
> 
>> Raising to a float power is really a niche feature.<
> 
> Used it as x^^0.5 to perform the square root is not a niche feature, square roots are common enough.
> And sqrt is an intrinsic, it doesn't need all std.math.


> 
> Error messages are not good yet, this program:
> 
> 
> import std.c.stdio: printf;
> void main() {
>     printf("%f\n", 2.5 ^^ 0.5);
> }
> 
> 
> Generates:
> 
> test.d(3): Error: must import std.math to use ^^ operator
> test.d(3): Error: undefined identifier module test5.std
> test.d(3): Error: no property 'math' for type 'void'
> Error: no property 'sqrt' for type 'int'
> test.d(3): Error: function expected before (), not __error of type int
> 
> 
> Alternative single error:
> 
> test.d(4): Error: must import std.math to use "x ^^ floating point".

Please don't complain about this obvious stuff. Parasitic error 
suppression is an ongoing task in the compiler. It's gradually 
improving, and there's nothing special about this particular case.


> If I change the code a little the situation doesn't improve a lot:
> 
> import std.c.stdio: printf;
> import std.math: sqrt;
> void main() {
>     printf("%f\n", 2.5 ^^ 0.5);
> }
> 
> 
> test5.d(4): Error: undefined identifier module test5.std
> test5.d(4): Error: no property 'math' for type 'void'
> Error: no property 'sqrt' for type 'int'
> test5.d(4): Error: function expected before (), not __error of type int
> 
> 
> So I can see various solutions:
> 
> 1) Keep the situation as now, but improve the error messages (essentially printing only one error message that's more focused).
> 
> 2) As the point (1), but in the case of x^^0.5 doesn't require the import math; x^^FP requires the import still.
> 
> 3) Automatically import the pow() in all modules, even if this causes the import of lot of std.math. So no errors are generated.
> 
> 4) Automatically import the pow() in a module only if it contains a x^^FP where FP is a floating point != 0.5  So the code in most modules is not affected by std.math.
> 
> Regardless what the final decision will be, this topic must be discussed in the D newsgroup, it's not something you have to decide for yourself (despite you are a very programmer, Don). This subthread can even be moved to the main D newsgroup.

I see it as a VERY minor issue, we don't need to deal with it for a long 
time.


More information about the Digitalmars-d-learn mailing list