Алексей ВМ 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 (изменено) · Жалоба Добрый день, STM32F429, Keil 5.16a Возникла проблема при преобразовании uint32_t в float: float * value; uint32_t val = 0xFFFFFFFF; *value = *(float*)&val; В результате в *value -1.#QNAN. Что я делаю не так? В тоже время float a = 0xFFFFFFFF; приводит к значениюю 4.2949673e+009 в переменной а. Алексей. Изменено 3 февраля, 2016 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Это смотря чего вы хотите добиться. Преобразование чисел делается так float * value; uint32_t val = 0xFFFFFFFF; *value = val; Вы же берете sizeof(float) байт по адресу &val и копируете их по адресу value. ЗЫ На всякий случай - 4-байтный float число 0xffffffff точно сохранить не сможет, точность будет примерно 7 знаков ~4.2949672*10^9 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 (изменено) · Жалоба Это смотря чего вы хотите добиться. Преобразование чисел делается так float * value; uint32_t val = 0xFFFFFFFF; *value = val; Вы же берете sizeof(float) байт по адресу &val и копируете их по адресу value Мне надо записать и прочитать float в еепром. Есть функция uint8_t EEPROM_Read(uint32_t Addr, uint8_t * buf, uint32_t count); которая читает в uint8_t буфер байты. Если еепром чистая, то в буфере будут все 0xFF. Функция, которая читает float, выглядит так uint8_t EEPROM_read_float(uint32_t Addr, float * value) { uint32_t val; uint8_t ret; ret = EEPROM_Read(Addr, (uint8_t*)&val, 4); *value = *(float*)&val; return ret; } Вот она и глючит. Изменено 3 февраля, 2016 пользователем Алексей ВМ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба uint8_t EEPROM_read_float(uint32_t Addr, float * value) { return EEPROM_Read(Addr, (uint8_t*)&value, 4); } Вот она и глючит. Это не она глючит ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Это не она глючит ;) ок, не она. А что (кто)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба ок, не она. А что (кто)? я ж откуда знаю. У вас проблема в чем? Прочитанное не совпадает с записанным? Или то, что чистая eeprom дает вам NAN? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Если еепром чистая, то в буфере будут все 0xFF. ЕМНИП, float, в котором все байты 0xFF, - это неправильный float. Вот оно и ругается. Не все возможные коды допустимы для float. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба ЕМНИП, float, в котором все байты 0xFF, - это неправильный float. Вот оно и ругается. Не все возможные коды допустимы для float. он не ругается, он говорит, что это NaN - Not a number. Это допустимое значение для float... Вот тут можно поклацать и посмотреть http://www.h-schmidt.net/FloatConverter/IEEE754.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба ЕМНИП, float, в котором все байты 0xFF, - это неправильный float. Вот оно и ругается. Не все возможные коды допустимы для float. float a = 0xFFFFFFFF; приводит к значению 4.2949673e+009 в переменной а. У вас проблема в чем? Или то, что чистая eeprom дает вам NAN? Именно. Причем для приведенного выше примера с присвоением в переменной число. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба он не ругается, он говорит, что это NaN - Not a number. Это допустимое значение для float... Ну ладно, это вопрос интерпретации. Но исходный вопрос как бы иллюстрирует кашу в голове у вопрошающего.. Там надо начинать с начала. Что хотим сделать? Что не получилось? Почему не получилось? Ну и т.д. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба float a = 0xFFFFFFFF; приводит к значению 4.2949673e+009 в переменной а. И что? Это же преобразование чисел по правилам арифметики, а не интерпретация 4-х байт как float Именно. Причем для приведенного выше примера с присвоением в переменной число. uint8_t EEPROM_read_float(uint32_t Addr, float * value) { ret = EEPROM_Read(Addr, (uint8_t*)&value, 4); if (*value != *value) // NaN != NaN *value = 0; // или что вы хотите по умолчанию? return ret; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба float a = 0xFFFFFFFF; приводит к значению 4.2949673e+009 в переменной а. Забавно, что Вас это удивляет. Попробуйте понять, почему a и b будут иметь разные значения: float a = 0xFFFFFFFF; const int i = 0xFFFFFFFF; float b = *(float*)&i; Это же азы. Нельзя же так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Алексей ВМ 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба И что? Это же преобразование чисел по правилам арифметики, а не интерпретация 4-х байт как float ок, теперь ясно, спасибо. Забавно, что Вас это удивляет. Это же азы. Нельзя же так... В переменной "а" не NaN, а число. Пример приведен лишь для этого, впрочем, выше уже все объяснили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Мне надо записать и прочитать float в еепром. union в помощь. :1111493779: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба union в помощь. :1111493779: Стесняюсь спросить, а зачем тут union? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться