реклама на сайте
подробности

 
 
> Как определить что float имеет не цифровое значение (NaN)
LeshaL
сообщение Mar 13 2006, 11:03
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 14-01-06
Пользователь №: 13 160



В __eeprom обьявлена переменная типа float. Как с минимальными затратами определить, что эта переменная имеет нечисловой формат (когда по адресу хранения float появляется значение 0xFFFFFFFF) чтобы привести ее в какое-нибудь начальное значение числового формата? Операции сравнения не работают. Если я пытаюсь определить нечисловой формат так:
if(my_float==0.NaN),
то, судя по ассемблерному тексту, my_float сравнивается не с 0xFFFFFFFF, a c 0x7FFFFFFF. Если сравниваю так: if(my_float==-0.NaN), то ничего не меняется...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
starter48
сообщение Mar 13 2006, 13:31
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 15-10-05
Из: Томск
Пользователь №: 9 680



Цитата(LeshaL @ Mar 13 2006, 17:03) *
В __eeprom обьявлена переменная типа float. Как с минимальными затратами определить, что эта переменная имеет нечисловой формат (когда по адресу хранения float появляется значение 0xFFFFFFFF) чтобы привести ее в какое-нибудь начальное значение числового формата? Операции сравнения не работают. Если я пытаюсь определить нечисловой формат так:
if(my_float==0.NaN),
то, судя по ассемблерному тексту, my_float сравнивается не с 0xFFFFFFFF, a c 0x7FFFFFFF. Если сравниваю так: if(my_float==-0.NaN), то ничего не меняется...

я делал так (в IAR 3.20):
Код
static char is_nan(const float *F)
{
  return ((((unsigned char*)F)[2] & 0x80)==0x80) && ((((unsigned char*)F)[3] & 0x7F)==0x7F);
}

Этой ф-ии передаю указатель на float в RAM.
Но эта ф-я зависит от порядка байт во float, этот вариант для IAR320 для AVR.
Измени её под свои требования.
Go to the top of the page
 
+Quote Post
LeshaL
сообщение Mar 13 2006, 15:03
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 14-01-06
Пользователь №: 13 160



Цитата(starter48 @ Mar 13 2006, 18:31) *
Цитата(LeshaL @ Mar 13 2006, 17:03) *

В __eeprom обьявлена переменная типа float. Как с минимальными затратами определить, что эта переменная имеет нечисловой формат (когда по адресу хранения float появляется значение 0xFFFFFFFF) чтобы привести ее в какое-нибудь начальное значение числового формата? Операции сравнения не работают. Если я пытаюсь определить нечисловой формат так:
if(my_float==0.NaN),
то, судя по ассемблерному тексту, my_float сравнивается не с 0xFFFFFFFF, a c 0x7FFFFFFF. Если сравниваю так: if(my_float==-0.NaN), то ничего не меняется...

я делал так (в IAR 3.20):
Код
static char is_nan(const float *F)
{
  return ((((unsigned char*)F)[2] & 0x80)==0x80) && ((((unsigned char*)F)[3] & 0x7F)==0x7F);
}

Этой ф-ии передаю указатель на float в RAM.
Но эта ф-я зависит от порядка байт во float, этот вариант для IAR320 для AVR.
Измени её под свои требования.


В том то и дело, что передается указатель на float в RAM, а мне нужно проверить float во внутреннем eeprom. Каждый раз организовывать промежуточную переменную типа float только лишь для проверки валидности данных типа float в eeprom в разных кусках программы как-то коряво. Неужели нет более простого пути? Красиво работает if(my_float==0.NaN), но проверяет только на 0x7FFFFFFF, а в eeprom, сами понимаете, чаще может быть значение 0xFFFFFFFF.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016