英锐恩单片机论坛,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