Скажите, коллеги, и просто сочувствующие, а вот у вас такой код не вызывает подозрений?
uint8_t *buffer = malloc(...)
size_t offset = 0
buf_append_float32(buffer, config->voltage, 1e3, &offset);
buf_append_float32(buffer, config->current, 1e3, &offset);
buf_append_float32(buffer, config->temperature, 1e2, &offset);
Нет? Точно нет? А должен вызывать
(
Read more... )
Comments 25
Reply
Мои претензии больше к тому, что в документации написано float.
Reply
Погромист писюковой школы, привыкший к бесплатному float и болт положивший на быстродействие, так и будет делать. У того же, кто начинал с 8 бит, при слове float стразу начинает свербить.
Если в конторе на такого кодера нет погромиста-проверяльщика ( как их там сейчас называют - тимлиды?), всё так и будет. Или претензия только в том, что имя функции не отражает то, что она делает?
Что до менеджеров - покажите мне хоть одного , который сходу назовёт разницу между float и int. Да это и не их задача.
Reply
float давно уже аппаратный, даже в контроллерах. Кроме пресловутых восьмибиток и M0 какого-нибудь. У меня правда тоже начинает свербить, но по другой причине - в kernel mode это небесплатно (не столько по перформансу, сколько по "еще и за этим следить") в смысле сохранения/восстановления контекста.
Ну и какое-нибудь printf("time %d.%03ds", milliseconds/1000, milliseconds%1000) сильно однозначнее в смысле получаемой точности и округления.
Что до менеджеров - покажите мне хоть одного , который сходу назовёт разницу между float и int
Не знаю, из тех с кем я работал, наверное все бы справились. Вот между float32 и fp24:8 посложнее, но тоже думаю не вызвало бы особых проблем. Вот программиста я видел, который в ядро пытался засунуть floating point вычисления потому что в документации банальный fixed point описали академично, в духе: "число представляется полиномом bit6*2^0+bit5*2^(-1)+bit4*2^(-2)...", хотя там можно было обойтись битовой маской и сдвигом.
Reply
Reply
Reply
вызывает и дофига
1. зачем маллок вместо обычной локальной переменной на стеке
1а. фри не забыли? во всех ветках? а эксепшены убрать не забыли?
2. почему массив, а не структура
3. таки да, степени десятки и двойки, таки да, имена типов - это же извращенный фиксед, ни разу не флоат - это сантицельсии и милливольты с миллиамперами
4. вообще, да, удивляет, насколько "обычные программисты" обожают СИ и ненавидят СГС.
Reply
2. потому что это потом в уарт отправлять и не морочиться с memory layout.
3. что надо курить чтобы ЭТО назвать float?
4. по факту это почти сгс и есть :)
Reply
2. делаю что-то типа mk_pkt(void *buffer, u32_t size) или без сайз, потому что сайз уже заполнен в пакете, а этак мк_ считает црц и прочие штампы.
ну, лайаут в любом случае надо бы помнить на стороне ембеддед. и с несовпадением лайаута могут быть примерно те же косяки как и с потоком append_foo(&offset); append_bar(&offset);
3. про флоат - дааа...
4. угу. хотя, я обычно натягиваю весь диапазон на весь диапазон инт_хх, или прибиваю полусантивольты гвоздями. плавучку для физ.величин как-то в голову не приходит применять.
Reply
это не говоря о том, что сериализация вручную - ну такое себе. полно готовых решений.
4. полусантивольты - это жёстко. в int32 как правило помещается всё что надо при разумном выборе базы из ряда (кило/милли/микро). или, для эстетов, в fp24:8 опять же при разумном выборе.
Reply
Leave a comment