Как ловить, когда поплавок = -1.#IO

У меня есть проблема в моем коде RobotC, когда при float достигает бесконечности возвращается -1.#IO

Это значение, которое возвращается, если float достигает -Infinity,

Так что проблема в том, float можно использовать только числовые значения. Я не могу поймать это значение.

Если я поставлю

if (value == -1.#IO) { ... }

компилятор говорит unexpected #

Если я поставлю

if (value == "-1.#IO") { ... }

компилятор говорит char string constant '"-1.#IO"' cannot be compared with value, Это очевидно, потому что он пытается сравнить строку с float

Теперь моя формула вычисляет диапазон значений, в которых иногда может существовать как отрицательная, так и положительная бесконечность.

Поэтому мне нужно найти способ поймать это значение, когда оно всплывает, чтобы я мог заменить его числовым float значение (которое в этом случае будет 0).

float my_Trig_LawOfSin_2Sides1Angle(float angleA, float sideA, float sideB) //SideA must be opposite AngleA
{
    //Catch the divide by 0 on this first line and then return sideA+sideB;
    if (angleA == 0) {
        return sideA + sideB; //this is to avoid the divide by 0 error 
                              //when the bot is looking straight.
                              //It will return the distance of the
    }
    float angleB = (asin(sideB * sin(angleA * (pi / 180)) / sideA)) * (180 / pi);
    if (angleB == "-1.#IO") { return 0; }

    float angleC = 180 - (angleA + angleB);
    float sideC = sideA * sin(angleC * (pi / 180)) / sin(AngleA * (pi / 180));
    return sideC;
}

task main()
{
    result = my_Trig_LawOfSin_2Sides1Angle(50, 200, 300);
}

2 ответа

Если бы вы программировали на C, вы могли бы использовать макросы, определенные в <math.h> проверить на бесконечные значения или значения NaN:

  • int isinf(f) возвращает ненулевое значение, если f это бесконечное значение, положительное отрицательное.
  • int isnan(f) возвращает ненулевое значение, если f является значением NaN. Значения NaN (не число) создаются, когда выражение не имеет определенного значения: pow(0.0, 0.0), 0.0 / 0.0...
  • isfinite(f) возвращает ненулевое значение f не является ни бесконечным, ни нан.

Ваша среда использует C-подобный диалект, который может поддерживать или не поддерживать эти макросы, в противном случае вы можете проверить бесконечность с помощью этого простого обходного пути:

if (1.0 / value == 0) {
    /* value is an infinity */
}

Я узнал, что если я преобразую число с плавающей точкой в ​​строку, он преобразует -1#IO в -1.#IND00

Поэтому я решил поймать это, и это сработало.

...
    float angleB = (asin(sideB*sin(angleA*(pi/180))/sideA))*(180/pi);

    string infinityCatch = angleB;
    if (infinityCatch == "-1.#IND00"){return 0;}
...
Другие вопросы по тегам