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

 找回密码
 立即注册
搜索
电子烟方案单片机单片机开发深圳单片机开发
单片机方案国产单片机8位单片机电子烟方案开发
查看: 4350|回复: 2
打印 上一主题 下一主题

为何sqrt不能正常工作?

[复制链接]
跳转到指定楼层
1#
发表于 2009-4-18 14:00:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环境:mplab6.61+picc8.35pl1
现象:在c程序中使用double变量,做了初始化, + - * \ 都正常,但是sqrt会出现一个莫名其妙的结果
,在build的option中尝试过选择32位或24位格式的浮点数,但都不行
pow()一样不能工作
比sqrt还要糟,debug时跑了半天,跳出来一个对话框说:no error message
本来还想自己编一个sqrt的,可是现在觉得肯定要从编译器方面找原因,否则发现一个不对且不就要自己写一个?
2#
 楼主| 发表于 2009-4-18 14:01:03 | 只看该作者
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 上使。
回复 支持 反对

使用道具 举报

3#
 楼主| 发表于 2009-4-18 14:01:11 | 只看该作者
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 );
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|公司首页|Microchip单片机,模拟器件,接口电路,麦肯单片机,单片机应用交流 ( 粤ICP备09008620号 )

GMT+8, 2024-11-24 01:49 , Processed in 0.056354 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表