Кто любит RISC в жизни, заходим, не стесняемся.
Сб июн 04, 2022 17:16:19
У меня возник вопрос .Есть вещественное число.Как мне организовать правильно увеличения инкремента.Как выбрать шаг?.И каким образом его сохранить в EEPROM.И в flash памяти?
Сб июн 04, 2022 17:25:06
Формат float занимает 4 байта под число одинарной точности. Формат double - 8 байт под число двойной точности. Вот с таким шагом их и хранить.
Сб июн 04, 2022 18:00:08
каким образом его сохранить в EEPROM.И в flash памяти?
Есть смутное подозрение, что ваша затея хранить флоат ничем не обоснована. Флоат - это не просто дробное число. Просто дробные числа можно хранить в целочисленном формате.
Сб июн 04, 2022 18:19:48
А я вообще не понял вопроса, у меня он как: "выбрать шаг инкремента для float"... это, как минимум, странно.
Сб июн 04, 2022 19:29:10
Есть смутное подозрение, что ваша затея хранить флоат ничем не обоснована. Флоат - это не просто дробное число. Просто дробные числа можно хранить в целочисленном формате.
Боюсь от Вашей фразы ТС вообще в exception выпадет.
Сб июн 04, 2022 22:17:20
Вероятно имеется ввиду инкремент указателя на float применительно к тому, сколько места выделить в еепромке под переменную float.
Сб июн 04, 2022 22:25:14
По предыдущим сообщениям.float десятые от целого числа.А double сотые или я ошибаюсь.Значит инкремент 0.1 минимум для float а для double 0.01?А ка же сохранить это число в памяти EEPROM?
Сб июн 04, 2022 22:33:15
По предыдущим сообщениям.float десятые от целого числа.
Шозабред?
Флоат - это ПЛАВАЮЩАЯ запятая. Флоат перекрывает диапазон от 1,2*10^−38 до 3,4*10^+38. Флоат имеет нелинейное разрешение и никакой "инкремент" к нему не применим по определению.
Тоже самое и с даблом. Только у него диапазон чисел другой.
Вс июн 05, 2022 04:36:03
Ну хорошо инкремент не применим.Ну а как сохранить данные числа ?
Вс июн 05, 2022 05:55:02
Сохранять как обычные 32-х (для флоат) или 64-х (для дабл) разрядные числа. Только у меня остался вопрос. А зачем вам вообще потребовался флоат или дабл? Что такого вы делаете, что без них никак? Да еще и сохранять их нужно....
Вс июн 05, 2022 05:56:46
- Код:
void WriteEEPROM(unsigned ee_adr, uint8_t *src, unsigned len);
int main()
{
float x;
WriteEEPROM(0,&x,sizeof(x));
}
Собственно, вместо float может быть вообще что угодно.
Вс июн 05, 2022 07:12:31
Я правда функциями не пользуюсь.Функция -удобна.Но у меня не пошла.И как это инкремента для вещественного floatне может быть? а настройка кондиционеров ?
Вс июн 05, 2022 07:15:29
ivan dimir писал(а):float десятые от целого числа.А double сотые или я ошибаюсь.Значит инкремент 0.1 минимум для float а для double 0.01
Это неверно.
- Код:
1/8бит = 0,00390625
1/16бит = 0,0000152587890625
1/32бит = 0,00000000023283064365386962890625
float - ?
Если мантисса имеет разрядность 23бит, то 1/23бит = 0,000000119209303761638 по идеи это и есть минимум для float.
Вы с успехом можете инкрементировать хоть на 0,0000125.
Но проблема заключается в другом.
А как уже написали
КРАМ писал(а):Флоат имеет нелинейное разрешение и никакой "инкремент" к нему не применим по определению.
ivan dimir, попробуйте инкрементировать на 0,0125 и через несколько инкрементов у вас вылезет ошибка. Которая с последующими инкрементами будет только накапливаться, что в конечном итоге приведет к неверному результату.
Вс июн 05, 2022 09:06:28
дело не в ошибке.
у понятий инкремент и плав.точка абсолютно разный базис.
Вы же нигде не встречали рулетку не на металлической полосе, а на резиновой ленте.
разные свойства - разное применение.
Вс июн 05, 2022 10:06:09
А почему бы тогда не сделать в целых числах, а запятую ставить вручную. Тоесть напимер 25,3° будет записываться целым числом 253 и его можно инкрементировать по 1 для 0,1° или по 10 для 1°. То есть нецелое число с десятыми или сотыми долями просто домножается на 10 или 100 и таким образом десятичная запятая уходит и не нужен никакой float - достаточно int16_t или int32t. Все расчеты будут в целочисленной математике, а при выводе на дисплей десятичную запятую можно поставить вручную, разделив число на две части - до и после запятой.
Автору нужно разобраться с темой представления чисел.
Вс июн 05, 2022 10:13:27
А почему бы тогда не сделать в целых числах, а запятую ставить вручную.
Вы только что изобрели fix point...
Только для этого не надо переходить на двоично-десятичное представление чисел. Хватит и просто двоичного. Так диапазон чисел будет заметно шире, а множитель станет степенью двойки, что заменит умножение/деление на арифметические сдвиги.
Вс июн 05, 2022 10:18:06
Я просто не стал называть это слишком сложным словом и объяснил "на пальцах" как попроще
И я не говорил про BCD, я имел ввиду записать не float t = 25.3, а int16_t t = 253. А при выводе этого числа на дисплей вывести его как оно есть, а точку поставить вручную между разрядами.
Вс июн 05, 2022 10:20:49
Как это вывод вручную.Ну число 253*1/10 я так понимаю?А потм вывод присвоить float(duoble)переменной это число и вывод этого числа на экран?
Вс июн 05, 2022 10:23:48
а настройка кондиционеров ?
Вы путаете вывод на индикацию с математикой регулирования. Регулирование не требует никаких дробей, если конечно диапазон требуемых чисел не выходит за целочисленную разрядность. Но и тогда флоат употребляется при расчетах очень ограничено (например как тип у коэффициентов рекурсивных фильтров - IIR). При выводе не дисплей чисел с фиксированной десятичной разрядностью, место запятой определяется отдельно от целого числа.
Ну и нет никакой необходимости хранить в EEPROM запятые. Достаточно хранить приведенное к целому число (то есть сдвинутое до целого).
Вс июн 05, 2022 10:25:37
В зависимости от того, какую функцию вы используете для вывода текста на дисплей и от того, какой дисплей применяете. Если обычный семисегментный 3-разрядный, то отобразите на нем число "253" и включите точку во втором разряде индикатора, чтобы получилось на дисплее "25.3"
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.