2017-02-21 100 views
-3

У меня есть проблема в моем RobotC коде, где, когда float достигает бесконечности возвращается -1.#IOКак поймать, когда поплавок = -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); 
} 
+0

Прочтите [ask] и предоставьте [mcve]. Совершенно непонятно, о чем вы спрашиваете, или о вашей проблеме, - если это не язык C. Для последнего есть хорошие книги, преподающие язык. – Olaf

+0

Я думал, что это было ясно, и я пытался использовать как можно меньше кода. Поэтому почему я сказал, что если вы хотите, чтобы мой составитель мог добавить его. В моих прошлых сообщениях люди сказали мне, чтобы я не отправлял код и сообщение onley, что такое nessacery aand, и это то, что я сделал – skyline

+0

Есть очень четкие правила сайта. Прочтите ссылки. – Olaf

ответ

3

Если вы программировали на 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 */ 
} 
-4

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

Так что я решил поймать, что insted и это сработало.

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

    string infinityCatch = angleB; 
    if (infinityCatch == "-1.#IND00"){return 0;} 
... 
+2

Какой язык программирования вы используете? – chqrlie

+0

Я использовал C внутри RobotC для vex IDE. – skyline

+0

'string' не является стандартным типом C. Пожалуйста, прочитайте [ask], вы не предоставляете всю необходимую информацию в своем вопросе, но предположите, что это универсально. Учитывая, что 'string' - некоторый тип строки, это ** не ** действительный C! – Olaf