Посоны, нужна ваша помощь. Есть две функции для записи и чтения значений в \ из регистров. Но какая-то из них работает некорректно. Что я имею ввиду: из регистра А считывается значение типа float, допустим, 812.159973. Это значение (или любое другое float) записывается в регистры B и С в качестве верхних и нижних порогов. Но функция чтения этих регистров возвращает значение типа float равное 823.000000, хотя по идее там должно быть 820.000000. Т.е. надо сформировать корректный байт, состоящий из мантиссы и экспоненты (см. пикрелейтед) для этих регистров.http://pastebin.com/k5WxfPrpИ ещё, как допилить функцию записи, чтобы записывалось ближайшее болшее значение, например, 813.000000 вместо 812.159973?Спасибо, если у кого найдётся свободное время для решения моей проблемки.
Бамп.
Ну же, пантсуаны, байтоёбы среди вас перевелись?Если что не понятно расписал - спрашивайте, уточню.
Это си? Особо не вникал но float маловат для такого длинного числа. double бы взял или long double.
>>714502 (OP)Вообще непонятно что ты хочешь и что делаешь.
>>714502 (OP)А ты в курсе, как вообще тип float представлен в памяти?
>>714878>Это си? Особо не вникал но float маловат для такого длинного числа. double бы взял или long double.Да, это Си. В оригинале был тип double. Попробую вернуть, может что поправит.>>714987Нет, не особо. Знаю только, что он менее точен, чем double, ну и размерность другая.>>714933Надо рандомное число типа double(?) преобразовать с помощью формул, которые приведены в пикрелейтед ОП-посте, в байты Lower / Upper lux threshold для записи.А потом вычитать их.
>>714502 (OP)Дабл не нужен. Это анон смеётся над твоей необразованностью.Суть в том, что в флоате и так есть то, что тебе нужно - мантисса и экспонента.typedef union { float f; struct { unsigned int mantisa : 23; unsigned int exponent : 8; unsigned int sign : 1; } parts;} float_cast;float_cast union_for_cast;union_for_cast.f = (value / 16) / 0.045;int fixed_mantisa = union_for_cast.parts.mantisa | 1 << 23;//fixed_mantisa -= 15 << 16;fixed_mantisa += 1 << 19;int fixed_exponent = union_for_cast.parts.exponent;if (fixed_mantissa >> 24 == 1) {fixed_exponent++;fixed_mantisa >>= 1;}//if (fixed_mantisa >> 23 == 0) {//fixed_exponent--;//fixed_mantissa <<= 1;//}return fixed_exponent << 4 + fixed_mantissa >> 20;
>>715247Закинь, пожалуйста, полные функции записи и чтения.Они сходятся по формулам с ОП-пикрелейтед?
>>715251Понятия не имею сходятся ли, не запускал. Нет желания с Си возиться.
>>715252Ок.Тгда всё ещё нужна помощь :)
>>715247>Это анон смеётся над твоей необразованностью.Ахуеть смищно, уже можно кататься по полу и не вылезать ис пад стала?