# HP Forums

Full Version: multi criteria IF statement
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,

I'm trying to write a program for directional angle calculation.

But my issue are the IF statements.

I have to test two variables in 4 different scenarios.

example Local y,x,n;

IF ( y>0 and x>0) then n:=ATAN( y/x); /// 1' scenario if the y or x is not greater next test
IF( y>0 and x<0) then n:=ATAN (y/x)+180; //// 2' scenario
IF( y<0 and x<0) then n:=ATAN(y/x)+180; //// 3' scenario
IF ( y<0 and x>0) then n:=ATAN(y/x)+360; ///// 4'

And i'm not sure how to write it.

Code:
```IF ( y>0) THEN     IF (x>0) THEN     n:=ATAN(y/x);     ELSE IF ( y>0) THEN     IF( x<0) THEN     n:=(ATAN(y/x))+pi;     ELSE IF ( y<0) THEN     IF(x<0) THEN     n:=(ATAN(y/x))+pi;     ELSE     n:=(ATAN(y/x))+(2*pi);```

I have tried like that, but i't doesnt give the correct awnser. And also at end of program i have to write END; like 6 times or so.
I would probably use a case statement for that task:

Code:
```EXPORT Amer7scode(x,y) BEGIN  LOCAL n, orig;  orig:=HAngle;   HAngle:=1;  CASE   IF y>0 AND x>0 THEN n:=ATAN(y/x) END;   IF y>0 AND x<0 THEN n:=ATAN(y/x)+180 END;   IF y<0 AND x<0 THEN n:=ATAN(y/x)+180 END;   IF y<0 AND x>0 THEN n:=ATAN(y/x)+360 END;   DEFAULT n:="error"  END;  HAngle:=orig;  RETURN n; END;```

Thanks,
that worked like charm. I wonder where, and how you learn these tricks and expressions.

Here is the complete code for Directional Angle - Geodesy - HP Prime
Code:
```EXPORT Directional() BEGIN LOCAL Ay,Ax,By,Bx; INPUT({Ay,Ax,By,Bx},"Direkcioni", {"Y tacke A","X tacke A","Y tacke B","X tacke b"}); LOCAL y,x,n,c; y:=By-Ay; x:=Bx-Ax; CASE   IF y>0 AND x>0 THEN n:=ATAN(y/x) END;   IF y>0 AND x<0 THEN n:=ATAN(y/x)+180 END;   IF y<0 AND x<0 THEN n:=ATAN(y/x)+180 END;   IF y<0 AND x>0 THEN n:=ATAN(y/x)+360 END;   DEFAULT n:="error"  END;  c:=→HMS(n);  RETURN c; END;```
(06-11-2021 11:06 AM)Amer7 Wrote: [ -> ]Hello,

I'm trying to write a program for directional angle calculation.

Why write a function when one is already built in?

look up ARG(X+i*Y)
As a new prime user I appreciate seeing smaller programs even if they replicate built-in functions.

I have several questions.

1. How does the program know that the calculator is in degrees mode versus radians?

2. What does "c:=→HMS(n);" mean? It probably has to do with the HMS function
which I haven't used yet.

3. What is the english translation for the word "tacke"

Thanks.
I can answer the 1st 2

1 there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app

2 →HMS() changes a degree to DMS
HMS→() changes DMS to degree

3 I dont know
(06-12-2021 03:05 AM)Dougggg Wrote: [ -> ]there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app

On HP Prime emulator, HAngle cannot be set to 0 in CAS (Why?)

CAS> HAngle := 0 ﻿ ﻿ ﻿ ﻿ ﻿ ﻿ → "HAngle(0) Error: Bad Argument Value"

It might be better to use AAngle instead, see http://edspi31415.blogspot.com/2018/02/h...mcalc.html

Code:
```EXPORT bearing(x,y) // x=north, y=east BEGIN IF x = 0 THEN       // avoid divide-by-0     y := sign(y)*90; ELSE     AAngle := 2;    // degree mode     y := atan(y/x) + (x<0)*180;     AAngle := 0;    // restore END; return →HMS(y MOD 360); END;```

(06-11-2021 02:04 PM)toml_12953 Wrote: [ -> ]Why write a function when one is already built in?

look up ARG(X+i*Y)

Because there is a bug in ARG ?

Code:
```EXPORT bearing(x,y) // x=north, y=east BEGIN AAngle := 2;        // degree mode y := atan2(y,x); AAngle := 0;        // restore return →HMS(y MOD 360); END;```
Don't forget to handle points on the vertical axis, including the origin. I'll arbitrarily assign 0 to atan(0,0). I haven't had nearly enough coffee yet and I'm not fluent in PPL, but in C++:

Code:
```        if (x==0) {             if (y == 0)                 n = 0;      // at the origin             else                 n = 90 + 180*(y<0);  // on the y axis         } else {             // C++ atan() returns radians, so convert to degrees             n = atan(y/x) * 180 / 3.141592653589792; // assume 1st quadrant             if (x < 0) n += 180;    // adjust for quadrants 2 and 3             else if (y < 0) n += 360; // adjust for quadrant 4         }```
(06-12-2021 11:53 AM)Albert Chan Wrote: [ -> ]
(06-12-2021 03:05 AM)Dougggg Wrote: [ -> ]there is a system varable HAngle you can set to 0 for radian and 1 for degrees, by default it is set in the setup screen or app

On HP Prime emulator, HAngle cannot be set to 0 in CAS (Why?)

CAS> HAngle := 0 ﻿ ﻿ ﻿ ﻿ ﻿ ﻿ → "HAngle(0) Error: Bad Argument Value"

It might be better to use AAngle instead, see http://edspi31415.blogspot.com/2018/02/h...mcalc.html

Code:
```EXPORT bearing(x,y) // x=north, y=east BEGIN IF x = 0 THEN       // avoid divide-by-0     y := sign(y)*90; ELSE     AAngle := 2;    // degree mode     y := atan(y/x) + (x<0)*180;     AAngle := 0;    // restore END; return →HMS(y MOD 360); END;```

(06-11-2021 02:04 PM)toml_12953 Wrote: [ -> ]Why write a function when one is already built in?

look up ARG(X+i*Y)

Because there is a bug in ARG ?

The bug must have been fixed again. I get the proper 45 with all the examples in that thread.
(06-13-2021 05:35 AM)toml_12953 Wrote: [ -> ]
(06-12-2021 11:53 AM)Albert Chan Wrote: [ -> ]Because there is a bug in ARG ?

The bug must have been fixed again. I get the proper 45 with all the examples in that thread.

Strange... my G2 running firmware 14588 (2021 05 05) still has that bug (namely, arg(3+3.*i) in CAS view returns its answer in radians even when Prime is in Degrees mode). Make sure you're in CAS view, degree mode, and include the decimal point.
(06-13-2021 01:10 PM)Joe Horn Wrote: [ -> ]
(06-13-2021 05:35 AM)toml_12953 Wrote: [ -> ]The bug must have been fixed again. I get the proper 45 with all the examples in that thread.

Strange... my G2 running firmware 14588 (2021 05 05) still has that bug (namely, arg(3+3.*i) in CAS view returns its answer in radians even when Prime is in Degrees mode). Make sure you're in CAS view, degree mode, and include the decimal point.

I just checked it again. Now it comes up with radians. I was sure I checked the angular mode before but I must not have. Of course in Home mode, it does work properly and that's the mode I always use so I never would have run into this bug.
I found that while in CAS mode the prime allows HAngle to be set to one or two.

After an attempt to do

HAngle:=0

an error message appears, namely: