I created an algorithm to calculate the type of triangle with three given sides a, b and c (given in any order) after an assignment on Codewars Link
My idea was to create a function int triangleType(int a, int b, int c) which takes a, b and c as input and returns:
"0" for no triangle,
"1" for an acute triangle,
"2" for a right triangle and
"3" for an obtuse triangle.
The requirements for a triangle are met if (a < (b + c) && b < (a + c) && c < (a + b)){/*...*/}.
To evaluate the triangle type one first needs the angles of the triangle so i calculated the angles with the <math.h> function acos(), (however it took me a painstakingly long time to realize that outputs a radiant result... after that i converted it with the constant 57.2958 from rads to degrees)
After calculating the angles i simply tried to assess whether all the angles are smaller than 90 degrees (-> acute triangle), or if one of them is 90 degrees (right triangle) or one of them is bigger than 90 degrees (-> obtuse triangle).
Troubleshooting some syntax it all worked but one test:
printf("%d\n", triangleType(3, 4, 5));  // right triangle, expected output: 2
For troubleshooting, I let the program write me the calculated angles as well:
printf("The triangle is right. The angles are alpha = %.4lf, beta = %.4lf, gamma = %.4lf.\n", alpha, beta, gamma);
Now comes the weird part: The output for triangleType(3,4,5) is: "1 -> The triangle is acute. The angles are alpha = 36.8699, beta = 53.1301, gamma = 90.0000. " So the program doesnt even jump to the if(angle == 90 ...) statement because it is certain that gamma, which was just accurately calculated to be 90.000 is SMALLER than 90?!
I feel like i just oversaw something trivial but i could not find the answer.
Here is the code (I hope it is readable im just starting out...)
#include <stdio.h>
#include <string.h>
#include <math.h>
#define RAD_T_DEG 57.2958
#define TOTAL_DEG 180
#define PI 3.141592653589793238
#define RIGHT_ANGLE 90.0000
int triangleType(int a, int b, int c);
int main(void)
{
    printf("%d\n", triangleType(7, 3, 2));  // not a triangle 0
    printf("%d\n", triangleType(2, 4, 6));  // not a triangle 0
    printf("%d\n", triangleType(8, 5, 7));  // acute 1
    printf("%d\n", triangleType(3, 4, 5));  // right 2
    printf("%d\n", triangleType(7, 12, 8)); // obtuse 3
    return 0;
}
int triangleType(int a, int b, int c)
{
    if (a < (b + c) && b < (a + c) && c < (a + b)) // if the requirements of a triangle are met calculate it
    {
        double alpha, beta, gamma;
        alpha = RAD_T_DEG * acos((double) (b*b+c*c-a*a)/(2*b*c)); //convert alpha in radiants to degrees
        beta = RAD_T_DEG * acos((double) (a*a+c*c-b*b)/(2*a*c));
        gamma = TOTAL_DEG - (alpha+beta);
        if(alpha < RIGHT_ANGLE && beta < RIGHT_ANGLE && gamma < RIGHT_ANGLE){
            printf("The triangle is acute. The angles are alpha = %.4lf, beta = %.4lf, gamma = %.4lf.\n", alpha, beta, gamma);
            return 1;
        }
        else if(alpha == RIGHT_ANGLE || beta == RIGHT_ANGLE || gamma == RIGHT_ANGLE){
            printf("The triangle is right. The angles are alpha = %.4lf, beta = %.4lf, gamma = %.4lf.\n", alpha, beta, gamma);
            return 2;
        }
        else if(alpha > RIGHT_ANGLE || beta > RIGHT_ANGLE || gamma > RIGHT_ANGLE){
            printf("The triangle is obtuse. The angles are alpha = %.4lf, beta = %.4lf, gamma = %.4lf.\n", alpha, beta, gamma);
            return 3;
        }
    }
    else // if it is not a triangle return 0
    {
        printf("No triangle can be formed with the given integer values for the sides.\n");
        return 0;
    }
}
