Instable evaluation of combined logical expressions
John W. Eaton
jwe at octave.org
Fri Feb 13 09:48:47 CST 2009
On 13-Feb-2009, Jörg Bretschneider wrote:
| Bug report for Octave 3.0.3 configured for i686-pc-msdosmsvc
|
| Description:
| -----------
|
| Octave seems to evaluate all expressions in combined logical condition
| expressions,
| i.e. cond1 LOGICALOPERATOR cond2 (LOGICALOPERATOR ...)
| even if the logical result of the condition is already determined by the
| first condition
| An error occurs if the syntactical validity of the second or further
| conditions depends
| on a FALSE value of the first condition, e.g. an index request into an
| empty matrix.
| It is not unusual to check the length of an array first in order to
| request a condition
| on some of its elements. The example works with Matlab for years, but
| not Octave 3.0.x
|
| Repeat-By:
| ---------
|
| x=[]; if ~isempty(x) & x(1) ~= 0, disp('do something'), end
|
| Fix:
| ---
| A work around for this was to pose multiple separate IF conditions,
| but this is not the preferred way, as octave can easily understand
| that an AND expression is FALSE if its first condition is, as well
| as an OR expression is TRUE if its first condition is, there may be
| other instances but the first one is the most important case.
| I had to adapt hundreds of lines of M-code to make it compatible.
We consider the way that | and & short-circuit to be a bug in Matlab,
because they only short-circuit in some instances (IF and WHILE
conditions) and the behavior is different if you do
t = a & b;
if (t) ...
vs
if (a & b) ...
A better solution for you is to use the && and || operators which
always do short-circuiting.
jwe
More information about the Bug-octave
mailing list