Thread overview
log for complex
Mar 07, 2018
J-S Caux
Mar 07, 2018
Simen Kjærås
Mar 07, 2018
J-S Caux
Mar 07, 2018
Simen Kjærås
Mar 07, 2018
J-S Caux
Mar 07, 2018
H. S. Teoh
March 07, 2018
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...
March 07, 2018
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
March 07, 2018
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.

March 07, 2018
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
March 07, 2018
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.
March 07, 2018
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.