Я написал алгоритм для MCU, который выполняет выражение двух параллельных сопротивлений, прежде чем выполнять дополнительные вычисления с результатом деления. При отладке значения не имели смысла; они были слишком большими, и переменная float не обновляла свое начальное значение.
Поэтому я зашел на 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/(что-то меньшее)?