Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
March 31, 2005 Function overloading (not working as I expected) | ||||
---|---|---|---|---|
| ||||
(I apologize if this ends up being a duplicate posting. The first time I tried posting didn't seem to work.) Hello fellow D programmers and enthusiasts. I am wondering if you might be able to help me with a problem. I thought it would be a good idea to write a bunch of complex math routines to complement D's native complex types. To begin, I wrote a quick function to compute complex z to the real power n (z^n = r^n(cos(n*theta) + sin(n*theta)i)). It's definition is: creal pow(creal z, real n){...code...}. The function works fine, I've even used it to draw some fractals. The problem arises when I want to call regular pow as defined in std.math which has two definitions: real pow(real, real) and real pow(real, uint) DMD compiles my code to use my pow function, even though I'm not passing any complex variables or assigning the return value to a complex variable. The only way I've gotten DMD to call the correct function is to explicitly call std.math.pow. Is there any solution to this aside from just renaming my function to cpow? Thank you for your help. - Peter |
March 31, 2005 Re: Function overloading (not working as I expected) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Federighi | "Peter Federighi" <pfederighi@yahoo.com> wrote in message news:d2h9tp$1ct5$1@digitaldaemon.com... > To begin, I wrote a quick function to compute complex z to the real power n (z^n > = r^n(cos(n*theta) + sin(n*theta)i)). It's definition is: > creal pow(creal z, real n){...code...}. > > The function works fine, I've even used it to draw some fractals. The problem > arises when I want to call regular pow as defined in std.math which has two > definitions: > real pow(real, real) and > real pow(real, uint) > > DMD compiles my code to use my pow function, even though I'm not passing any > complex variables or assigning the return value to a complex variable. The only > way I've gotten DMD to call the correct function is to explicitly call std.math.pow. > > Is there any solution to this aside from just renaming my function to cpow? What are the exact types of the arguments you are passing to pow()? |
April 03, 2005 Re: Function overloading (not working as I expected) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | Walter: Thanks for responding. Here's the code I'm trying to work with. I've noted where I try to call pow() and dmd doesn't do it correctly. I've also tried explicitly casting the values I pass to pow, but dmd still gets it wrong. Thanks again. - Peter // // Begin code // import std.math; import std.math2; void main () { cdouble z = 4 + 4i; double d; printf("z = %f + %fi\n", z.re, z.im); z = sqrt(cast(creal)z); printf("sqrt(z) = %f + %fi\n", z.re, z.im); z = 4 + 4i; d = abs(z); printf("abs(z) = %f\n", d); z = 4 + 4i; d = sqrt(abs(z)); printf("sqrt(abs(z)) = %f\n", d); z = 4 + 4i; d = hypot(z.re, z.im); printf("hypot(z) = %f\n", d); // d^2 -- DOES NOT CALL THE CORRECT POW() d = pow(d, 2); printf("pow(hypot(z.re, z.im), 2) = %f\n", d); // sqrt(z) z = pow(z, .5); printf("pow(z, .5) = %f +%fi\n", z.re, z.im); } real abs (creal z) { return z.re * z.re + z.im * z.im; } // Computes complex z to the real power n // z^n = r^n(cos(n*theta) + sin(n*theta)i) creal pow (creal z, real n) { // hypot() is the more correct way. It catches errors, etc. // sqrt(abs()) is the faster way. It does not catch errors. // real rn = pow(hypot(z.re, z.im), abs(n)); // DOES NOT CALL THE CORRECT POW() -- in this case it recurses until it blows // the stack and segfaults real rn = pow(sqrt(abs(z)), abs(n)); real angle; creal rtn; if (!z.re) angle = PI_2 * sign(z.im) * abs(n); else angle = atan(z.im / z.re) * sign(z.re) * abs(n); rtn = rn * (cos(angle) + sin(angle)*1i); if (n < 0) return 1 / rtn; else return rtn; } // // End code // In article <d2hg0h$1kel$2@digitaldaemon.com>, Walter says... > > >"Peter Federighi" <pfederighi@yahoo.com> wrote in message news:d2h9tp$1ct5$1@digitaldaemon.com... >> To begin, I wrote a quick function to compute complex z to the real power >n (z^n >> = r^n(cos(n*theta) + sin(n*theta)i)). It's definition is: >> creal pow(creal z, real n){...code...}. >> >> The function works fine, I've even used it to draw some fractals. The >problem >> arises when I want to call regular pow as defined in std.math which has >two >> definitions: >> real pow(real, real) and >> real pow(real, uint) >> >> DMD compiles my code to use my pow function, even though I'm not passing >any >> complex variables or assigning the return value to a complex variable. >The only >> way I've gotten DMD to call the correct function is to explicitly call std.math.pow. >> >> Is there any solution to this aside from just renaming my function to >cpow? > >What are the exact types of the arguments you are passing to pow()? |
April 05, 2005 Re: Function overloading (not working as I expected) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Federighi | "Peter Federighi" <pfederighi@yahoo.com> wrote in message news:d2ovu8$2l1t$1@digitaldaemon.com... > Walter: > Thanks for responding. Here's the code I'm trying to work with. I've noted > where I try to call pow() and dmd doesn't do it correctly. I've also tried > explicitly casting the values I pass to pow, but dmd still gets it wrong. Try explicitly casting the arguments to the exact types of the pow() you wish to call. |
April 07, 2005 Re: Function overloading (not working as I expected) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Walter | In article <d2t0iu$ruj$1@digitaldaemon.com>, Walter says... > >"Peter Federighi" <pfederighi@yahoo.com> wrote in message news:d2ovu8$2l1t$1@digitaldaemon.com... >> Walter: >> Thanks for responding. Here's the code I'm trying to work with. I've >noted >> where I try to call pow() and dmd doesn't do it correctly. I've also >tried >> explicitly casting the values I pass to pow, but dmd still gets it wrong. > >Try explicitly casting the arguments to the exact types of the pow() you >wish to call. I tried that. It still didn't work. If it works for you, what version of dmd are you using? I'm using the Linux release of version 0.113. - Peter |
April 16, 2005 Re: Function overloading (not working as I expected) | ||||
---|---|---|---|---|
| ||||
Posted in reply to Peter Federighi | "Peter Federighi" <pfederighi@yahoo.com> wrote in message news:d32vvc$1md7$1@digitaldaemon.com... > In article <d2t0iu$ruj$1@digitaldaemon.com>, Walter says... > > > >"Peter Federighi" <pfederighi@yahoo.com> wrote in message news:d2ovu8$2l1t$1@digitaldaemon.com... > >> Walter: > >> Thanks for responding. Here's the code I'm trying to work with. I've > >noted > >> where I try to call pow() and dmd doesn't do it correctly. I've also > >tried > >> explicitly casting the values I pass to pow, but dmd still gets it wrong. > > > >Try explicitly casting the arguments to the exact types of the pow() you > >wish to call. > > I tried that. It still didn't work. Please post the exact code of that that didn't work. > If it works for you, what version of dmd > are you using? I'm using the Linux release of version 0.113. |
Copyright © 1999-2021 by the D Language Foundation