Как ловить, когда поплавок = -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;}
...