cancel
Showing results for 
Search instead for 
Did you mean: 
genovad
Surveyor

Using IF statements in Formula Questions

Jump to solution

Hello, I'm somewhat new to using Canvas for quizzes and am trying to make a formula question.  Without getting into too many details, the question will provide two variables, x and y.  If 3x < y, the question will have one answer, and if 3x > y, the question will have another.  I was planning to use the IF function to help with this.  There may be a more elegant method, but I was thinking that if 3x < y, the statement could return one value, and if it didn't, it could return another.  However, I cannot seem to find any guides or help on how to use this function, and all my attempts to do it keep giving me errors like "unrecognized token at 8" or "unexpected equals at 5".  Can anyone point me in the right direction?  I've been trying to use the statement if(3x<y,1,0).  I thought that if the first statement were true, it would return 1, and if not, it would return 0.  THANKS!

Tags (3)
2 Solutions

Accepted Solutions
James
Navigator

 @genovad  

Somewhere, there's a lengthy discussion about using formulas with IF (I probably contributed heavily to it), but I don't remember where, so I'll try a short explanation here and hopefully someone can find the other one if necessary.

The IF() function needs a boolean condition, a true or a false. Mathematically, those are normally 1 and 0, but anything other than 0 is considered true.

You can not use relational operators like < or >.

The logic here gets a little convoluted

  • If 3x < y then 3x - y < 0. If 3x > y then 3x - y > 0.
  • The signum(x) function, often written as SIGN(x), returns -1 if x < 0, +1 if x > 0, and 0 if x = 0.
  • SIGN(3x-y) is -1 when 3x<y, +1 when 3x>y, and 0 when 3x=y
  • Both -1 and +1 are considered true
  • 1+SIGN(3x-y) is 0 (false) when 3x<y, 2 (true) when 3x>y, and 1 (true) when 3x=y
  • SIGN(3x-y)-1 is -2 (true) when 3x<y, 0 (false) when 3x>y, and -1 (true) when 3x=y
  • Canvas does not have the SIGN(x) function, so you have to create your own. SIGN(x)=x/ABS(x)
  • 1+(3x-y)/ABS(3x-y) is 0 (false) when 3x<y, 2 (true) when 3x>y, and undefined because you get division by 0 when 3x=y
  • To avoid division by 0, first check to see if 3x=y or 3x-y=0 (false) or not zero (true).
  • Nest the check for less than inside the check for equality

IF(3x-y,IF(1+(3x-y)/ABS(3x-y),do_when_3x>y,do_when_3x<y),do_when_3x=y)

Replace the do_when_ blocks with whatever formula you need.

If you can guarantee that 3x is never y, then you can omit the outside IF() and just use the inner.

IF(1+(3x-y)/ABS(3x-y),do_when_3x>y,do_when_3x<y)

I would include both since it doesn't cost any extra except at the time you generate the question.

 

View solution in original post

jrgsampaio
Surveyor

There is a simple way to solve this problem: 
To test if A > B just do:

 

if ( (A-B)+abs(A-B),  {case A > B},  {case A<=B}) 


No division required.

Jorge Sampaio

View solution in original post

3 Replies
James
Navigator

 @genovad  

Somewhere, there's a lengthy discussion about using formulas with IF (I probably contributed heavily to it), but I don't remember where, so I'll try a short explanation here and hopefully someone can find the other one if necessary.

The IF() function needs a boolean condition, a true or a false. Mathematically, those are normally 1 and 0, but anything other than 0 is considered true.

You can not use relational operators like < or >.

The logic here gets a little convoluted

  • If 3x < y then 3x - y < 0. If 3x > y then 3x - y > 0.
  • The signum(x) function, often written as SIGN(x), returns -1 if x < 0, +1 if x > 0, and 0 if x = 0.
  • SIGN(3x-y) is -1 when 3x<y, +1 when 3x>y, and 0 when 3x=y
  • Both -1 and +1 are considered true
  • 1+SIGN(3x-y) is 0 (false) when 3x<y, 2 (true) when 3x>y, and 1 (true) when 3x=y
  • SIGN(3x-y)-1 is -2 (true) when 3x<y, 0 (false) when 3x>y, and -1 (true) when 3x=y
  • Canvas does not have the SIGN(x) function, so you have to create your own. SIGN(x)=x/ABS(x)
  • 1+(3x-y)/ABS(3x-y) is 0 (false) when 3x<y, 2 (true) when 3x>y, and undefined because you get division by 0 when 3x=y
  • To avoid division by 0, first check to see if 3x=y or 3x-y=0 (false) or not zero (true).
  • Nest the check for less than inside the check for equality

IF(3x-y,IF(1+(3x-y)/ABS(3x-y),do_when_3x>y,do_when_3x<y),do_when_3x=y)

Replace the do_when_ blocks with whatever formula you need.

If you can guarantee that 3x is never y, then you can omit the outside IF() and just use the inner.

IF(1+(3x-y)/ABS(3x-y),do_when_3x>y,do_when_3x<y)

I would include both since it doesn't cost any extra except at the time you generate the question.

 

View solution in original post

Awesome!  This is exactly what I needed.  I figured out with some experimentation that it only accepted 0 or not 0 for initial arguments, but I was really at a loss for how to do something with that.  There just didn't seem to be a lot of functions to help.  Your explanation is great and I can now get this to work.  Thank you!

jrgsampaio
Surveyor

There is a simple way to solve this problem: 
To test if A > B just do:

 

if ( (A-B)+abs(A-B),  {case A > B},  {case A<=B}) 


No division required.

Jorge Sampaio

View solution in original post