Перейти к содержанию
    

STM32F429: ошибка преобразования uint32_t в float

Добрый день,

 

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 в переменной а.

 

Алексей.

Изменено пользователем Алексей ВМ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это смотря чего вы хотите добиться. Преобразование чисел делается так

float * value;
uint32_t val = 0xFFFFFFFF;

*value = val;

 

Вы же берете sizeof(float) байт по адресу &val и копируете их по адресу value.

 

ЗЫ На всякий случай - 4-байтный float число 0xffffffff точно сохранить не сможет, точность будет примерно 7 знаков ~4.2949672*10^9

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это смотря чего вы хотите добиться. Преобразование чисел делается так

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;    
}

 

Вот она и глючит.

Изменено пользователем Алексей ВМ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

uint8_t EEPROM_read_float(uint32_t Addr, float * value)
{    
        return EEPROM_Read(Addr, (uint8_t*)&value, 4);    
}

 

Вот она и глючит.

 

Это не она глючит ;)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ок, не она. А что (кто)?

 

я ж откуда знаю. У вас проблема в чем? Прочитанное не совпадает с записанным? Или то, что чистая eeprom дает вам NAN?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если еепром чистая, то в буфере будут все 0xFF.

ЕМНИП, float, в котором все байты 0xFF, - это неправильный float. Вот оно и ругается. Не все возможные коды допустимы для float.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЕМНИП, float, в котором все байты 0xFF, - это неправильный float. Вот оно и ругается. Не все возможные коды допустимы для float.

 

он не ругается, он говорит, что это NaN - Not a number. Это допустимое значение для float...

 

Вот тут можно поклацать и посмотреть http://www.h-schmidt.net/FloatConverter/IEEE754.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЕМНИП, float, в котором все байты 0xFF, - это неправильный float. Вот оно и ругается. Не все возможные коды допустимы для float.

 

float a = 0xFFFFFFFF; приводит к значению 4.2949673e+009 в переменной а.

 

 

 

 

 

 

 

 

 

У вас проблема в чем? Или то, что чистая eeprom дает вам NAN?

 

Именно. Причем для приведенного выше примера с присвоением в переменной число.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

он не ругается, он говорит, что это NaN - Not a number. Это допустимое значение для float...

Ну ладно, это вопрос интерпретации.

Но исходный вопрос как бы иллюстрирует кашу в голове у вопрошающего.. Там надо начинать с начала. Что хотим сделать? Что не получилось? Почему не получилось? Ну и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;    
}

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

float a = 0xFFFFFFFF; приводит к значению 4.2949673e+009 в переменной а.

Забавно, что Вас это удивляет.

Попробуйте понять, почему a и b будут иметь разные значения:

float a = 0xFFFFFFFF;
const int i = 0xFFFFFFFF;
float b = *(float*)&i;

Это же азы. Нельзя же так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что? Это же преобразование чисел по правилам арифметики, а не интерпретация 4-х байт как float

 

ок, теперь ясно, спасибо.

 

 

Забавно, что Вас это удивляет.

Это же азы. Нельзя же так...

 

В переменной "а" не NaN, а число. Пример приведен лишь для этого, впрочем, выше уже все объяснили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...