обработка NaN в BCB60
От: Аноним  
Дата: 26.08.10 12:26
Оценка:
Добрый день.

Есть BCB60 и есть пример программы:
float get_NaN(){

  float ret=0;

  unsigned char *p;

  p=(unsigned char*)(&ret);

  p[0]=0xff;
  p[1]=0xff;
  p[2]=0xff;
  p[3]=0xff;

  return ret;
}

int work(){

  int ret=0;
  float a1=0;
  float a2;

  a1=get_NaN();
  a2=a1;

  if(a1==a2) ret=1;

  return ret;
}

int work1(){

  int ret=0;
  float a1=0;

  a1=get_NaN();

  if(a1<0.1) ret=1;

  return ret;
}

int work2(){

  int ret=0;
  float a1=0;
  float a2=0.1;

  a1=get_NaN();

  if(a1>a2) ret=1;

  return ret;
}

//---------------------------------------------------------------------------

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[]){

  int ret;
  ret=work();
  ret=work1();
  ret=work2();

  return ret;
}
//---------------------------------------------------------------------------

Этот пример транслируется, но при запуске падает с диагностикой:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EInvalidOp with message 'Invalid floating point operation'. Process stopped. Use Step or Run to continue.

Падает он на строке return ret; в функции get_NaN(). Причем только при втором проходе (то есть при вызове этой функции из work1())

Вопросы:

1. Как вообще по стандарту должно обрабатываться значение NaN?
2. Почему пример падает только при втором проходе?

Спасибо.
раскраска и отбивка — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.