www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - log for complex

reply J-S Caux <js gmail.com> writes:
Simple question: how do I get the log of a complex number?

If I try the simple
logtest = log(complex(1.0, 2.0))

I get the compiler error

Error: function core.stdc.math.log(double x) is not callable 
using argument types (Complex!double)

Some basic functions are described in 
https://dlang.org/phobos/std_complex.html, but not the log...
Mar 06 2018
parent reply Simen =?UTF-8?B?S2rDpnLDpXM=?= <simen.kjaras gmail.com> writes:
On Wednesday, 7 March 2018 at 07:42:37 UTC, J-S Caux wrote:
 Simple question: how do I get the log of a complex number?

 If I try the simple
 logtest = log(complex(1.0, 2.0))

 I get the compiler error

 Error: function core.stdc.math.log(double x) is not callable 
 using argument types (Complex!double)

 Some basic functions are described in 
 https://dlang.org/phobos/std_complex.html, but not the log...
That seems like an oversight. For now, this should work: auto log(T)(Complex!T x) { import std.math : log; return Complex!T(log (abs(x)), arg(x)); } -- Simen
Mar 07 2018
parent reply J-S Caux <js gmail.com> writes:
On Wednesday, 7 March 2018 at 08:04:36 UTC, Simen Kjærås wrote:
 On Wednesday, 7 March 2018 at 07:42:37 UTC, J-S Caux wrote:
 Simple question: how do I get the log of a complex number?

 If I try the simple
 logtest = log(complex(1.0, 2.0))

 I get the compiler error

 Error: function core.stdc.math.log(double x) is not callable 
 using argument types (Complex!double)

 Some basic functions are described in 
 https://dlang.org/phobos/std_complex.html, but not the log...
That seems like an oversight. For now, this should work: auto log(T)(Complex!T x) { import std.math : log; return Complex!T(log (abs(x)), arg(x)); } -- Simen
Yes indeed I can do this, but isn't this inefficient as compared to what it should be? The internals of arg are presumable already doing part of/all the necessary work.
Mar 07 2018
parent reply Simen =?UTF-8?B?S2rDpnLDpXM=?= <simen.kjaras gmail.com> writes:
On Wednesday, 7 March 2018 at 10:10:49 UTC, J-S Caux wrote:
 On Wednesday, 7 March 2018 at 08:04:36 UTC, Simen Kjærås wrote:
 auto log(T)(Complex!T x) {
     import std.math : log;
     return Complex!T(log(abs(x)), arg(x));
 }
Yes indeed I can do this, but isn't this inefficient as compared to what it should be? The internals of arg are presumable already doing part of/all the necessary work.
arg is just atan2 in disguise, and doesn't do any logarithms. I mean, in a way it does, but it's really just a fpatan instruction. I don't expect there to be many optimization opportunities here. -- Simen
Mar 07 2018
parent reply J-S Caux <js gmail.com> writes:
On Wednesday, 7 March 2018 at 10:28:23 UTC, Simen Kjærås wrote:
 On Wednesday, 7 March 2018 at 10:10:49 UTC, J-S Caux wrote:
 On Wednesday, 7 March 2018 at 08:04:36 UTC, Simen Kjærås wrote:
 auto log(T)(Complex!T x) {
     import std.math : log;
     return Complex!T(log(abs(x)), arg(x));
 }
Yes indeed I can do this, but isn't this inefficient as compared to what it should be? The internals of arg are presumable already doing part of/all the necessary work.
arg is just atan2 in disguise, and doesn't do any logarithms. I mean, in a way it does, but it's really just a fpatan instruction. I don't expect there to be many optimization opportunities here. -- Simen
OK thanks Simen. Should your suggestion for repairing this omission be filed as a bugreport? I can of course implement it locally for myself, but the language should really provide this function directly.
Mar 07 2018
parent "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Wed, Mar 07, 2018 at 10:47:40AM +0000, J-S Caux via Digitalmars-d-learn
wrote:
 On Wednesday, 7 March 2018 at 10:28:23 UTC, Simen Kjærås wrote:
 On Wednesday, 7 March 2018 at 10:10:49 UTC, J-S Caux wrote:
 On Wednesday, 7 March 2018 at 08:04:36 UTC, Simen Kjærås wrote:
 auto log(T)(Complex!T x) {
     import std.math : log;
     return Complex!T(log(abs(x)), arg(x));
 }
Yes indeed I can do this, but isn't this inefficient as compared to what it should be? The internals of arg are presumable already doing part of/all the necessary work.
arg is just atan2 in disguise, and doesn't do any logarithms. I mean, in a way it does, but it's really just a fpatan instruction. I don't expect there to be many optimization opportunities here.
[...]
 OK thanks Simen. Should your suggestion for repairing this omission be
 filed as a bugreport? I can of course implement it locally for myself,
 but the language should really provide this function directly.
Yes, please file a bug. T -- The trouble with TCP jokes is that it's like hearing the same joke over and over.
Mar 07 2018