Цитата(LeshaL @ Mar 13 2006, 21:03)

Цитата(starter48 @ Mar 13 2006, 18:31)

я делал так (в 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 в разных кусках программы как-то коряво. Неужели нет более простого пути?
Я тебе дал идею как распознать NaN. Переделай эту ф-ю для работаы с EEPROM.
Создавать отдельную переменную для этого совсем не обязательно.
Можешь использовать указатель на float в eeprom.
Пример (на железе не проверял):
Код
static unsigned char readEEPROM(unsigned char __eeprom *addr)
{
while(EECR&(1<<EEWE));//wait for EEWE -> 0
EEAR=(unsigned short)addr;
EECR|=(1<<EERE);//master read
EEAR=0;//to prevent EEPROM corruption
return EEDR;
}
static char is_nan(const float __eeprom *F)
{
return ((readEEPROM((unsigned char __eeprom*)F + 2) & 0x80)==0x80) &&
((readEEPROM((unsigned char __eeprom*)F + 3) & 0x7F)==0x7F);
}
Цитата(LeshaL @ Mar 13 2006, 21:03)

Красиво работает if(my_float==0.NaN), но проверяет только на 0x7FFFFFFF, а в eeprom, сами понимаете, чаще может быть значение 0xFFFFFFFF.
Это не корректно, т.к. NaN - это не только 0x7FFFFFFF.
Т.е. тестировать на NaN через сравнение с константой некорректно.