automatic Inf+NaN*i conversion
Ben Abbott
bpabbott at mac.com
Sat Apr 26 09:47:39 CDT 2008
On Apr 26, 2008, at 12:41 AM, Jaroslav Hajek wrote:
> On Sat, Apr 26, 2008 at 2:23 AM, Ben Abbott <bpabbott at mac.com> wrote:
>>
>>
>> On Apr 25, 2008, at 7:11 PM, John W. Eaton wrote:
>>
>>
>>> On 25-Apr-2008, Ben Abbott wrote:
>>>
>>> | On Apr 25, 2008, at 12:42 PM, Jaroslav Hajek wrote:
>>> |
>>> | > No, you are just plain wrong. As you have seen earlier, Inf
>>> +NaN*i
>>> | > does not give
>>> | > complex(Inf, NaN), but rather complex(NaN, NaN), due to the
>>> fact that
>>> | > it is calculated as
>>> | > complex(Inf + 0*NaN, 0 + 1*NaN). The behaviour of isinf is OK
>>> - it
>>> | > gives infinity if either part of the complex number is Inf.
>>> |
>>> | I thought I understood your point, but when I tested myself, the
>>> test
>>> | did not meet my expectation :-(
>>> |
>>> | Specifically, It appears to me that the two examples below are in
>>> | contradiction.
>>> |
>>> | octave:45> NaN*(1+0i) + Inf*(0+1i)
>>> | ans = NaN + Infi
>>> | octave:46> NaN*complex(1,0) + Inf*complex(0,1)
>>> | ans = NaN - NaNi
>>> |
>>> | What is happening in this instance?
>>>
>>> Break it down into the components and look at each of them
>>> separately. Note that 1+0i is 1 (i.e. not a complex value).
>>> Although
>>> it looks like you are writing a complex number when you write 1+0i,
>>> you are really writing an addition expression, and 0i is
>>> automatically
>>> converted to 0, so you are really writing 1+0. However, the
>>> result of
>>> complex(0,1) isn't automatically converted to real, so it does allow
>>> you to create complex values with zero imaginary components.
>>>
>>> Yes, NaN*complex(1,0) --> NaN - NaNi looks "wrong", but does the
>>> sign
>>> really matter here? I mean, it's a NaN. In any case, Jaroslav's
>>> patch is probably a reasonable thing to do (I haven't had a chance
>>> to
>>> try it yet).
>>>
>>> jwe
>>>
>>
>> My thought is that NaN should trump Inf ... or Inf should trump a
>> NaN.
>>
>> octave:57> NaN+1i*Inf
>> ans = NaN + Infi
>> octave:58> Inf+1i*NaN
>> ans = NaN - NaNi
>> octave:59>
>>
>> Although this behavior may be explained by examining the underlying
>> algorithm. Is the function of the algorithm sensible or proper?
>>
>> Should not both examples give consistent results? ... by consistent
>> I mean
>> that neither the real-part or the imag-part should be favored.
>>
>> ... or am I missing something?
>>
>> Ben
>>
> You just have to keep in mind that a+b*i is not a means of writing a
> constant in Octave (neither in Matlab), but rather a calculation. Inf
> is a real number, NaN is a real number, i is a complex number. After
> that, the whole matter becomes crystal clear.
>
> Further, I think that there is no IEEE standard on complex number
> arithmetic, so what NaN-ish and Inf-ish complex calculations should
> return is a matter for discussion. Personally, I'd tend to regard the
> C99 standard, Informal annex G (or some other letter, I'm not sure) as
> a reasonable authority, given that Octave is written in C++. I don't
> think C++98 standard addresses this anywhere, but the next standard
> probably will (or will reference the C99 standard).
So this boils down to
octave:1> NaN+Inf
ans = NaN
octave:2> 0*NaN
ans = NaN
octave:3> 0*Inf
ans = NaN
Correct?
Ben
More information about the Bug-octave
mailing list