Using IF statements in Formula Questions

Jump to solution
genovad
Community Member

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!

3 Solutions
James
Community Champion

 @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
Community Novice

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

CraigOgden
Community Participant

@James, I am not sure what you said about < and > is true.  I think it does accept inequalities.  This code worked just fine:

if(x<-10,100,200)

as well as this one:

if(x>=-10,100,200)

Let me know if I am misunderstanding my results.

View solution in original post

0 Likes