Интересно. Это вполне может быть ошибкой в программном обеспечении с плавающей запятой. Встраиваемые системы часто включают с плавающей запятой в качестве опции, чтобы уменьшить размер кода.
Я не уверен, что проблема здесь, хотя с момента вашего первого заявления работает.
Что происходит с:
result = 0.005 - 0.001;
result = -result;
result = 0.002 - 0.001;
result = 0.002 - 0.002;
result = 0.002 - 0.003;
result = 0.001 - 0.002;
result = 0.001 - 0.003;
result = 0.001 - 0.004;
Идея заключается в том, чтобы собрать полезную информацию о том, что может быть причиной его, обычная вещь, чтобы сделать в судебно-медицинской экспертизы. Результаты этих вычислений, вероятно, будут полезны при определении фактической проблемы.
Основываясь на результатах в комментариях:
result = 0.005 - 0.001; // 0.004
result = -result; // 0.000
result = 0.002 - 0.001; // 0.001
result = 0.002 - 0.002; // 0.000
result = 0.002 - 0.003; // 0.000
result = 0.001 - 0.002; // 0.000
result = 0.001 - 0.003; // 0.000
result = 0.001 - 0.004; // 0.000
Похоже, ваша библиотека с плавающей точкой имеет серьезный недостаток. Еще два вопроса:
- Как вы распечатка результатов (показать нам код фактического)?
- Какой микроконтроллер и среда разработки вы используете?
Возможно, возникла некоторая проблема с тем, как вы печатаете, или это может быть ограничение вашей среды.
Ajit, я думаю, вам действительно нужно дать нам код, который поможет вам. Не обязательно ваш реальный код (ваша озабоченность по поводу освобождения реального кода понятна), а именно некоторые, которые демонстрируют проблему.
Основываясь на некоторых из ваших комментариев, а именно:
Адриана, тип данных для «результата» является поплавок, то есть, 32-битное представление (одинарное). У меня есть CAN как системный интерфейс, и поэтому я умножаю результат на 1000, чтобы отправить его по шине CAN. Если это отрицательное число, например -0.003, то я ожидаю FF FD в сообщении CAN. У меня нет отладчика.
Я не уверен, что полностью понимаю, но я дам ему шанс.
У вас есть 32-битная с плавающей точкой, например, -0.003 и умножить ее на 1000 и положить его в целом числе (0xFFFD является 16-разрядным двоичным дополнением представления -3).Так что же происходит, когда вы запускаете что-то вроде следующего кода:
int main(void) {
float w = -0.003;
int x = (int)(w * 1000);
int y = -3;
int z = -32768;
// Show us you code here for printing x, y and z.
return 0;
}
Поэтому я хочу, чтобы вы, чтобы проверить целое число является то, что оно может не иметь ничего делать с поплавками на всех. Возможно, что значение float совершенно правильно, но есть некоторые проблемы с тем, как вы его печатаете (метод CAN).
Если «CAN» - это своего рода последовательный интерфейс, возможно, есть ограничение на байты, которые вам разрешено отправлять через него. Я могу предусмотреть сценарий, в котором высокие байты используются как маркеры пакетов, так что FF может на самом деле закончить сообщение преждевременно. Вот почему я также хочу, чтобы вы протестировали -32768 (0x8000).
Трудно поверить, что STMicroelectronics создаст такую систему времени исполнения, что не сможет обрабатывать отрицательные поплавки. Мне кажется гораздо более вероятным, что информация повреждается где-то в другом месте (например, процесс «печати», что бы это ни было).
Возможно, у вас есть 'unsigned float'. :) –