help - warning division by zero

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

help - warning division by zero

Joe Tusek

Hi,


I have code that uses ifelse statements to prevent the possibility of a division by zero. It appears though that all the conditions of the ifelse are evaluated as part of the ifelse execution and this results in a warning about a division by zero, even if the code should prevent such a case.

 

This leaves a warning of division by zero in the Command Window when the “executed code” had not resulted in one.

 

The code snippet has been crafted to generate the behaviour

 

>> ifelse (1==1,0,1/0)

warning: division by zero

ans = 0

>> ifelse (1==0,0,1/0)

warning: division by zero

ans =  Inf

>> ifelse (1==0,0,1)

ans =  1

 

Should this warning be supressed (so that it does not appear in the Command Window) when there was no active code that resulted in a division by zero?

 

Regards,
Joe

 

Joe Tusek (BE MBA)
Technical Director
23 Warabrook Boulevard, Warabrook, NSW 2304
P +61 2 4961 9000  M +61 418 669 250

 



Reply | Threaded
Open this post in threaded view
|

Re: help - warning division by zero

Andrew Janke-2


On 10/25/19 1:58 AM, Joe Tusek wrote:

> Hi,
>
>
> I have code that uses ifelse statements to prevent the possibility of a
> division by zero. It appears though that all the conditions of the
> ifelse are evaluated as part of the ifelse execution and this results in
> a warning about a division by zero, even if the code should prevent such
> a case.
>
> This leaves a warning of division by zero in the Command Window when the
> “executed code” had not resulted in one.
>
> The code snippet has been crafted to generate the behaviour
>
>>> ifelse (1==1,0,1/0)
>
> warning: division by zero
>
> ans = 0
>
>>> ifelse (1==0,0,1/0)
>
> warning: division by zero
>
> ans =  Inf
>
>>> ifelse (1==0,0,1)
>
> ans =  1
>
> Should this warning be supressed (so that it does not appear in the
> Command Window) when there was no active code that resulted in a
> division by zero?

Hi Joe,

What is this "ifelse" statement or function that you're using in your
example code? Octave doesn't have an "ifelse" statement.

If this is a function you've implemented yourself, you need to know that
Octave is an "eager-evaulation" language: all the input arguments to a
function are *always* evaluated before being passed in. So that "1/0"
that is the 3rd argument to the function always happens. This isn't like
a Lisp or whatever where you can have "lazy" evaluation.

To have something like this "short-circuit" and prevent argument
evaluation requires special support at the language level.

Cheers,
Andrew


Reply | Threaded
Open this post in threaded view
|

RE: help - warning division by zero

Joe Tusek
Hi Andrew,

I hadn't even considered the possibility that it was not an Octave command. I just thought it was undocumented.

What is the easiest way to find out where it is coming from?

I tried stepping into it but couldn't.

Regards,
Joe

Joe Tusek (BE MBA)
Technical Director
23 Warabrook Boulevard, Warabrook, NSW 2304
P +61 2 4961 9000  M +61 418 669 250

-----Original Message-----
From: Andrew Janke <[hidden email]>
Sent: Friday, 25 October 2019 5:04 PM
To: Joe Tusek <[hidden email]>; [hidden email]
Subject: Re: help - warning division by zero



On 10/25/19 1:58 AM, Joe Tusek wrote:

> Hi,
>
>
> I have code that uses ifelse statements to prevent the possibility of
> a division by zero. It appears though that all the conditions of the
> ifelse are evaluated as part of the ifelse execution and this results
> in a warning about a division by zero, even if the code should prevent
> such a case.
>
> This leaves a warning of division by zero in the Command Window when
> the "executed code" had not resulted in one.
>
> The code snippet has been crafted to generate the behaviour
>
>>> ifelse (1==1,0,1/0)
>
> warning: division by zero
>
> ans = 0
>
>>> ifelse (1==0,0,1/0)
>
> warning: division by zero
>
> ans =  Inf
>
>>> ifelse (1==0,0,1)
>
> ans =  1
>
> Should this warning be supressed (so that it does not appear in the
> Command Window) when there was no active code that resulted in a
> division by zero?

Hi Joe,

What is this "ifelse" statement or function that you're using in your example code? Octave doesn't have an "ifelse" statement.

If this is a function you've implemented yourself, you need to know that Octave is an "eager-evaulation" language: all the input arguments to a function are *always* evaluated before being passed in. So that "1/0"
that is the 3rd argument to the function always happens. This isn't like a Lisp or whatever where you can have "lazy" evaluation.

To have something like this "short-circuit" and prevent argument evaluation requires special support at the language level.

Cheers,
Andrew


Reply | Threaded
Open this post in threaded view
|

Re: help - warning division by zero

apjanke-floss
Hi Joe,

Convention on this mailing list is to "bottom-post", putting your reply
below the previous emails. Scroll down to see reply.

On 10/25/19 2:12 AM, Joe Tusek wrote:

> -----Original Message-----
> From: Andrew Janke <[hidden email]>
> Sent: Friday, 25 October 2019 5:04 PM
> To: Joe Tusek <[hidden email]>; [hidden email]
> Subject: Re: help - warning division by zero
>
>
>
> On 10/25/19 1:58 AM, Joe Tusek wrote:
>> Hi,
>>
>>
>> I have code that uses ifelse statements to prevent the possibility of
>> a division by zero. It appears though that all the conditions of the
>> ifelse are evaluated as part of the ifelse execution and this results
>> in a warning about a division by zero, even if the code should prevent
>> such a case.
>>
>> This leaves a warning of division by zero in the Command Window when
>> the "executed code" had not resulted in one.
>>
>> The code snippet has been crafted to generate the behaviour
>>
>>>> ifelse (1==1,0,1/0)
>>
>> warning: division by zero
>>
>> ans = 0
>>
>>>> ifelse (1==0,0,1/0)
>>
>> warning: division by zero
>>
>> ans =  Inf
>>
>>>> ifelse (1==0,0,1)
>>
>> ans =  1
>>
>> Should this warning be supressed (so that it does not appear in the
>> Command Window) when there was no active code that resulted in a
>> division by zero?
>
> Hi Joe,
>
> What is this "ifelse" statement or function that you're using in your example code? Octave doesn't have an "ifelse" statement.
>
> If this is a function you've implemented yourself, you need to know that Octave is an "eager-evaulation" language: all the input arguments to a function are *always* evaluated before being passed in. So that "1/0"
> that is the 3rd argument to the function always happens. This isn't like a Lisp or whatever where you can have "lazy" evaluation.
>
> To have something like this "short-circuit" and prevent argument evaluation requires special support at the language level.
>
> Cheers,
> Andrew
>

> I hadn't even considered the possibility that it was not an Octave
command. I just thought it was undocumented.
>
> What is the easiest way to find out where it is coming from?
>
> I tried stepping into it but couldn't.
>
> Regards,
> Joe
>


Holy cow, it actually exists! My bad.

> What is the easiest way to find out where it is coming from?

The easiest way to find out where any function or named thing is coming
from is using the "which" command.

>> which ifelse
'ifelse' is a built-in function from the file libinterp/corefcn/data.cc

>> help ifelse
'ifelse' is a built-in function from the file libinterp/corefcn/data.cc

 -- merge (MASK, TVAL, FVAL)
 -- ifelse (MASK, TVAL, FVAL)
     Merge elements of TRUE_VAL and FALSE_VAL, depending on the value of
     MASK.


So, it actually is an Octave thing. But since it's a _function_, and not
a special syntax, it doesn't have the short-circuiting behavior you
want. That is, you might be familiar with the ternary operator
"condition ? if-case : else-case" from C/C++ and elsewhere.
Unfortunately, Octave's ifelse() doesn't work like that.

If you want real short-circuiting behavior, you'll have to use regular
"if/else" statements at the Octave/M-code syntax level. You can write
them as one-liners if you really want:

if 1==1; 0 else 1/0; end


No warning happens when you do it this way.

Cheers,
Andrew


Reply | Threaded
Open this post in threaded view
|

RE: help - warning division by zero

Joe Tusek
-----Original Message-----
From: Andrew Janke <[hidden email]>
Sent: Friday, 25 October 2019 5:22 PM
To: Joe Tusek <[hidden email]>; [hidden email]
Subject: Re: help - warning division by zero

Hi Joe,

Convention on this mailing list is to "bottom-post", putting your reply below the previous emails. Scroll down to see reply.

On 10/25/19 2:12 AM, Joe Tusek wrote:

> -----Original Message-----
> From: Andrew Janke <[hidden email]>
> Sent: Friday, 25 October 2019 5:04 PM
> To: Joe Tusek <[hidden email]>; [hidden email]
> Subject: Re: help - warning division by zero
>
>
>
> On 10/25/19 1:58 AM, Joe Tusek wrote:
>> Hi,
>>
>>
>> I have code that uses ifelse statements to prevent the possibility of
>> a division by zero. It appears though that all the conditions of the
>> ifelse are evaluated as part of the ifelse execution and this results
>> in a warning about a division by zero, even if the code should
>> prevent such a case.
>>
>> This leaves a warning of division by zero in the Command Window when
>> the "executed code" had not resulted in one.
>>
>> The code snippet has been crafted to generate the behaviour
>>
>>>> ifelse (1==1,0,1/0)
>>
>> warning: division by zero
>>
>> ans = 0
>>
>>>> ifelse (1==0,0,1/0)
>>
>> warning: division by zero
>>
>> ans =  Inf
>>
>>>> ifelse (1==0,0,1)
>>
>> ans =  1
>>
>> Should this warning be supressed (so that it does not appear in the
>> Command Window) when there was no active code that resulted in a
>> division by zero?
>
> Hi Joe,
>
> What is this "ifelse" statement or function that you're using in your example code? Octave doesn't have an "ifelse" statement.
>
> If this is a function you've implemented yourself, you need to know that Octave is an "eager-evaulation" language: all the input arguments to a function are *always* evaluated before being passed in. So that "1/0"
> that is the 3rd argument to the function always happens. This isn't like a Lisp or whatever where you can have "lazy" evaluation.
>
> To have something like this "short-circuit" and prevent argument evaluation requires special support at the language level.
>
> Cheers,
> Andrew
>

> I hadn't even considered the possibility that it was not an Octave
command. I just thought it was undocumented.
>
> What is the easiest way to find out where it is coming from?
>
> I tried stepping into it but couldn't.
>
> Regards,
> Joe
>


Holy cow, it actually exists! My bad.

> What is the easiest way to find out where it is coming from?

The easiest way to find out where any function or named thing is coming from is using the "which" command.

>> which ifelse
'ifelse' is a built-in function from the file libinterp/corefcn/data.cc

>> help ifelse
'ifelse' is a built-in function from the file libinterp/corefcn/data.cc

 -- merge (MASK, TVAL, FVAL)
 -- ifelse (MASK, TVAL, FVAL)
     Merge elements of TRUE_VAL and FALSE_VAL, depending on the value of
     MASK.


So, it actually is an Octave thing. But since it's a _function_, and not a special syntax, it doesn't have the short-circuiting behavior you want. That is, you might be familiar with the ternary operator "condition ? if-case : else-case" from C/C++ and elsewhere.
Unfortunately, Octave's ifelse() doesn't work like that.

If you want real short-circuiting behavior, you'll have to use regular "if/else" statements at the Octave/M-code syntax level. You can write them as one-liners if you really want:

if 1==1; 0 else 1/0; end


No warning happens when you do it this way.

Cheers,
Andrew


Now it all makes sense.
I can't use it with that behaviour as it will confuse users about whether the division by zero affected the outcome. I will just have to do it longhand . Thanks.

Reply | Threaded
Open this post in threaded view
|

Re: help - warning division by zero

apjanke-floss


On 10/25/19 2:32 AM, Joe Tusek wrote:

> -----Original Message-----
> From: Andrew Janke <[hidden email]>
> Sent: Friday, 25 October 2019 5:22 PM
> To: Joe Tusek <[hidden email]>; [hidden email]
> Subject: Re: help - warning division by zero
>
> If you want real short-circuiting behavior, you'll have to use regular "if/else" statements at the Octave/M-code syntax level. You can write them as one-liners if you really want:
>
> if 1==1; 0 else 1/0; end
>
>
> No warning happens when you do it this way.
>
> Cheers,
> Andrew
>
>
> Now it all makes sense.
> I can't use it with that behaviour as it will confuse users about whether the division by zero affected the outcome. I will just have to do it longhand . Thanks.

You're welcome! Sorry we don't have a more convenient answer for you,
but that's how you have to do it.

Glad we could clear that up.

Cheers,
Andrew