📄 math.lst
字号:
C51 COMPILER V7.50 MATH 01/10/2006 16:49:28 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MATH
OBJECT MODULE PLACED IN math.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE math.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "include.h"
*** WARNING C318 IN LINE 5 OF include.h: can't open file 'maths.h'
2
3 /**********************************************
4 函数名: unsigned int Sqrt(unsigned long M)
5
6 输入参数:
7 unsigned long M--被开方数,长整型
8
9 输出参数: 无
10
11 返回值:
12 unsigned int--开方结果,整形
13
14 功能说明: 长整形数开方处理
15 **********************************************/
16 unsigned int Sqrt(unsigned long M)
17 {
18 1 unsigned int N, i;
19 1 unsigned long tmp, ttp; /* 结果、循环计数 */
20 1 unsigned char flag = 0;
21 1 if (M == 0) /* 被开方数,开方结果也为0 */
22 1 return 0;
23 1
24 1 if (M>0x3FF001)
25 1 {
26 2
27 2 M >>= 2;
28 2 flag = 1;
29 2 }
30 1
31 1 N = 0;
32 1
33 1 tmp = (M >> 30); /* 获取最高位:B[m-1] */
34 1 M <<= 2;
35 1 if (tmp > 1) /* 最高位为1 */
36 1 {
37 2 N ++; /* 结果当前位为1,否则为默认的0 */
38 2 tmp -= N;
39 2 }
40 1
41 1 for (i=15; i>0; i--) /* 求剩余的15位 */
42 1 {
43 2 N <<= 1; /* 左移一位 */
44 2
45 2 tmp <<= 2;
46 2 tmp += (M >> 30); /* 假设 */
47 2
48 2 ttp = N;
49 2 ttp = (ttp<<1)+1;
50 2
51 2 M <<= 2;
52 2 if (tmp >= ttp) /* 假设成立 */
53 2 {
54 3 tmp -= ttp;
C51 COMPILER V7.50 MATH 01/10/2006 16:49:28 PAGE 2
55 3 N ++;
56 3 }
57 2
58 2 }
59 1
60 1 if (flag)
61 1 N <<= 1;
62 1
63 1 return N;
64 1 }
65
66 /*长整型开方,返回浮点值*/
67 double lSqrt(unsigned long M )
68 {
69 1 unsigned int scale;
70 1
71 1 scale = 1;
72 1
73 1 if ( M == 0)
74 1 return 0;
75 1
76 1 if ( M < 0xffff )
77 1 {
78 2 M *= 0x10000;
79 2 scale = 0x100;
80 2 }
81 1
82 1 while ( M < 0x3fffffff )
83 1 {
84 2 M <<= 2;
85 2 scale <<=1;
86 2 }
87 1
88 1 return ( ( double )Sqrt( (unsigned long) M ) / scale );
89 1 }
90
91 /*浮点数的开方运算*/
92 double fSqrt(double M)
93 {
94 1 unsigned long scale;
95 1
96 1 scale = 1;
97 1 if ( M < 0.000001 )
98 1 return 0;
99 1
100 1 if ( M < 0xff )
101 1 {
102 2 M *= 0x1000000;
103 2 scale *= 0x1000;
104 2 }
105 1
106 1 if ( M < 0xffff )
107 1 {
108 2 M *= 0x10000;
109 2 scale *= 0x100;
110 2 }
111 1
112 1 while ( M < 0x3fffffff )
113 1 {
114 2 M *= 4 ;
115 2 scale *= 2 ;
116 2 }
C51 COMPILER V7.50 MATH 01/10/2006 16:49:28 PAGE 3
117 1
118 1 return ( ( double )Sqrt( (unsigned long) M ) / scale );
119 1 }
120
121
122
123 /*************************************************************
124 函数名: long lround()
125
126 输入参数:
127 long div--被除数,长整形
128 long by--除数,长整形
129
130 输出参数: 无
131
132 返回值:
133 long--计算结果
134
135 功能说明:求div/by的四舍五入的结果
136
137 *************************************************************/
138 long lRound(long div,long by)
139 {
140 1 long int temp;
141 1
142 1 if (by)
143 1 {
144 2 temp = div/by;
145 2 if (( (lAbs(div) % by) << 1) >= by)
*** WARNING C206 IN LINE 145 OF MATH.C: 'lAbs': missing function-prototype
*** ERROR C267 IN LINE 145 OF MATH.C: 'lAbs': requires ANSI-style prototype
146 2 if (div >= 0)
147 2 temp++;
148 2 else
149 2 temp--;
150 2 }
151 1 else
152 1 temp=div;
153 1
154 1 return(temp); /* 返回四舍五入的结果 */
155 1
156 1 } /* end lRound() */
157
158
159 /*********************************************************
160 函数名:long lAbs(long num) int Abs( int num ) double fAbs( double num )
161
162 输入参数:
163 long(int,double) num--待求绝对值的变量
164
165 输出参数: 无
166
167 返回值:
168 long(int,double)--返回变量num的绝对值
169
170 功能说明:求输入变量的绝对值。
171 *********************************************************/
172 long lAbs(long num)
173 {
*** ERROR C231 IN LINE 173 OF MATH.C: '_lAbs': redefinition
174 1 return ( num >= 0 ? num : -num );
175 1 }
C51 COMPILER V7.50 MATH 01/10/2006 16:49:28 PAGE 4
176
177 int Abs( int num )
178 {
179 1 return ( num >= 0 ? num : -num );
180 1 }
181
182 double fAbs( double num )
183 {
184 1 return ( num >= 0 ? num : -num );
185 1 }
186
187
188
189 /**************************************************************
190 函数名: long lSign(long num)
191
192 输入参数:
193 long num--待求符号数,长整形
194
195 输出参数: 无
196
197 返回值: num的正负符号1:>=0;-1<0
198
199 功能说明:求输入数的正负符号。
200 **************************************************************/
201 long lSign(long num)
202 {
203 1 return( num >= 0L ? 1l:-1l);
204 1 }
205
206
207
208 /****************************************************************************
209 函数名:unsigned char BCDToHex(unsigned char bcd_data)
210 unsigned char HexToBCD(unsigned char hex_data)
211
212 输入参数:
213 unsigned char bcd_data(hex_data)--待转换的8位BCD数或16进制数
214
215 输出参数: 无
216
217 返回值: 无
218
219 功能说明:把BCD数转换为16进制数或把16进制数转换为BCD数
220 ****************************************************************************/
221 unsigned char BCDToHex(unsigned char bcd_data)
222 {
223 1 unsigned char hex;
224 1 hex=(bcd_data/16)*10+bcd_data%16;
225 1 return(hex);
226 1 }
227
228 unsigned char HexToBCD(unsigned char hex_data)
229 {
230 1 unsigned char bcd;
231 1 bcd=(hex_data/10)*16+hex_data%10;
232 1 return(bcd);
233 1 }
234
235
236
237 /**************************************************************
C51 COMPILER V7.50 MATH 01/10/2006 16:49:28 PAGE 5
238 函数名: void Bin2Bcd32( long x, char* buffer)
239
240 输入参数:
241 long x--
242 char* buffer--
243
244 输出参数:
245 char* buffer--
246
247 返回值: 无
248
249 功能说明: 长整形数的bcd码
250 **************************************************************/
251 void Bin2Bcd32( long x, char* buffer)
252 {
253 1 x=lAbs(x);/*2005.11.17*/
254 1 buffer[9] = x/1000000000;
255 1 x = x%1000000000;
256 1 buffer[8] = x/100000000;
257 1 x = x%100000000;
258 1 buffer[7] = x/10000000;
259 1 x = x%10000000;
260 1 buffer[6] = x/1000000;
261 1 x = x%1000000;
262 1 buffer[5] = x/100000;
263 1 x = x%100000;
264 1 buffer[4] = x/10000;
265 1 x = x%10000;
266 1 buffer[3] = x/1000;
267 1 x = x%1000;
268 1 buffer[2] = x/100;
269 1 x = x%100;
270 1 buffer[1] = x/10;
271 1 buffer[0] = x%10;
272 1 }
273
274
C51 COMPILATION COMPLETE. 2 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -