英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流

标题: 为何sqrt不能正常工作? [打印本页]

作者: winnie    时间: 2009-4-18 14:00
标题: 为何sqrt不能正常工作?
环境:mplab6.61+picc8.35pl1
现象:在c程序中使用double变量,做了初始化, + - * \ 都正常,但是sqrt会出现一个莫名其妙的结果
,在build的option中尝试过选择32位或24位格式的浮点数,但都不行
pow()一样不能工作
比sqrt还要糟,debug时跑了半天,跳出来一个对话框说:no error message
本来还想自己编一个sqrt的,可是现在觉得肯定要从编译器方面找原因,否则发现一个不对且不就要自己写一个?
作者: winnie    时间: 2009-4-18 14:01
CCS 的庫函數 math.h 裡面的源程序

////////////////////////////////////////////////////////////////////////////
// float sqrt(float x)
////////////////////////////////////////////////////////////////////////////
// Description : returns the square root of x
// Date : N/A
//
float sqrt(float x)
{
   float y, res;
   BYTE *p;

   #ifdef _ERRNO
   if(x < 0)
   {
      errno=EDOM;
   }
   #endif

   if( x<=0.0)
      return(0.0);

   y=x;
   p=&y;
   (*p)=(BYTE)((((int16)(*p)) + 127) >> 1);

   do {
      res=y;
      y+=(x/y);
      (*p)--;
   } while(res != y);

   return(res);
}




小心,CCS 和 Hi-Tech 的浮點格式好像不一樣喔,可能沒法在 PICC 上使。
作者: winnie    时间: 2009-4-18 14:01
ANSI-C 都可以啦

float sqrt ( float x )
{
   float y, z;
   unsigned char *p;

   if(x<=0.0)  return(0.0);

   y = x;
// p = &y; (*p)=(int8)((((int16)(*p)) + 127) >> 1);   // CCS 直接把指數除以二,減少運算次數

   while (1)
   {
      z = y;
      y =(y + x/y) / 2.0;

      if (y == z) break;
   }
   return ( y );
}




欢迎光临 英锐恩单片机论坛,Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 (http://enroobbs.com/) Powered by Discuz! X3.2