Я написал алгоритм для MCU, который выполняет выражение двух параллельных сопротивлений перед выполнением дополнительных вычислений с результатом деления.При отладке значения не имели смысла;они были слишком большими и float var не обновлял их начальное значение.
Итак, я перешел к https://www.onlinegdb.com/ и попробовал часть своего алгоритма там.При выполнении кода он запускает нестандартный выход с арифметическим исключением в строке:
a = 1/(1/10 + 1/b) + 0.15;
Сначала я работал с float, но я думал, что исключение может быть вызвано переполнением, поэтому я сделал переменнуюпамяти больше, используя double, но появляется то же исключение.Затем я попытался сделать то же самое, но сказал:
a = (1/10 + 1/b) + 0.15;
и исполнение сработало!
Итак, я видел, что причиной был оператор '1'.Но я не совсем понимаю, почему и как это исправить (без использования math.h).
Код такой:
#include <stdio.h>
float a = 0.0;
int b = 100;
int main()
{
a = 1/(1/10 + 1/b) + 0.15;//Req
b = a; //get int part
a *= 10;//fractionary part converted to dec
if ((a - b*10)>5) b++;
printf("float: %f , int: %i",a,b);
return 0;
}
Я ожидал получить (отладка):
- a = 1 / (1/10 + 1/100) = 9.09
, что, на мой взгляд, не является большим значением для размещения в плавающей или двойной переменной,Вместо этого я получаю исключение.
Как работать со значениями типа float / double и int, чтобы избежать исключений, когда 1 / (что-то меньшее)?