# [rrd-users] Re: RPN Tutorial with logical operators (AND/OR)?

Alex van den Bogaerdt alex at ergens.op.het.net
Sun May 2 23:43:01 MEST 2004

```On Sun, May 02, 2004 at 05:26:41PM +0200, Laurent LEVIER wrote:

> I know * is the multiplication operator, but when you read this:
>    "CDEF:C2=in,\$L2,LT,in,\$L1,GE,*,in,\$L1,-,0,IF,in,\$L2,GT,\$L1,0,IF,+" \
> I think the 1st algorithm is: IF in<L2 AND in>=L1 then C2=in-L1 else C2=0.
>
> I dont understand what this * sign is doing here.

This is basic boolean algebra.  If the following is not enough, search for
boolean algebra on the Internet.

If "false" equals zero, and "true" equals any number but zero (usually one),
then the multiplication table is as follows:

AND:
A  B    result "A and B"

0  0    0*0 = 0 -> false
0  1    0*1 = 0 -> false
1  0    1*0 = 0 -> false
1  1    1*1 = 1 -> true

While I'm at it, here are some other boolean functions:

OR:
A  B    result "A or B"

0  0    0+0 = 0 -> false
0  1    0+1 = 1 -> true
1  0    1+0 = 1 -> true
1  1    1+1 = 2 -> true    <-- any number but zero!

XOR (one, but not both, true):

result = (A or B) and not (A and B)
result = (A and not B) or (B and not A)
result = if (A and B) then false else (A or B)

You could also use the method of checking against exactly one
as Hugo described.  When you do, make SURE the input is what
you expect.  Consider the following table:

A B
0 0   0+0 = 0 -> false
0 1   0+1 = 1 -> true
2 0   2+0 = 2 -> true
2 1   2+1 = 3 -> true

If you'd check the outcome against "1" (one), you'd miss the second true!
Also, if you'd check against "equal to two" in stead of "more than one",
you'd produce false results for the last true.

IMHO it is best to check XOR like this:

result=A,B,AND,false,A,B,OR,IF

(note: "AND", "OR" and "false" are used for clarity; fill in the
appropriate stuff: "*", "+" and "0").

which would produce the following stack processing:

1:  <empty>
2:  A
3:  A,B
4:  <result of A and B>
5:  <result of A and B>,false
6:  <result of A and B>,false,A
7:  <result of A and B>,false,A,B
8:  <result of A and B>,false,<result of A or B>
9:  <result of  IF (A and B) then FALSE else result of (A or B)>

In other words:

if (A is true) and (B is true)
then return false
else
if (A is true) or (B is true)
then return true
else return false

NOT (inverse):

Usually not necessary.  Example: "if (something) then this else that"
In stead of calculating the inverse of "something", you could do:
"if (something) then that else this"

If you really want the NOT function, there are two possibilities:

#1: you can rely on the boolean to be "0" or "1"
#2: you cannot

1:  result=1-A              in RPN    result=1,A,-
2:  if (A) then 0 else 1    in RPN    result=A,0,1,IF

When processing booleans, be aware that RRDtool does not only numbers.
It can also store "NaN" and "Inf" into variables!

The result of "NaN" times "true" is "NaN" which is not false, so it is true
(last time I checked the source, that is).

HTH
Alex

--
Unsubscribe mailto:rrd-users-request at list.ee.ethz.ch?subject=unsubscribe
Help        mailto:rrd-users-request at list.ee.ethz.ch?subject=help
Archive     http://www.ee.ethz.ch/~slist/rrd-users