o: ActiveSupport::Cache::Entry :@compressedF:@value"θΩ"αΩ
| main.lst | ||
|---|---|---|
| 1 |
CCS PCM C Compiler, Version 4.106, 47914 15-V-13 18:53
|
|
| 1 |
CCS PCM C Compiler, Version 4.106, 47914 15-V-13 20:34
|
|
| 2 | 2 |
|
| 3 | 3 |
Filename: Z:\home\kaklik\svnMLAB\Modules\Sensors\MAG01A\SW\PIC16F887\main.lst |
| 4 | 4 |
|
| 5 |
ROM used: 821 words (10%)
|
|
| 5 |
ROM used: 775 words (9%)
|
|
| 6 | 6 |
Largest free fragment is 2048 |
| 7 |
RAM used: 18 (5%) at main() level
|
|
| 8 |
27 (7%) worst case
|
|
| 7 |
RAM used: 28 (8%) at main() level
|
|
| 8 |
38 (10%) worst case
|
|
| 9 | 9 |
Stack: 2 locations |
| 10 | 10 |
|
| 11 | 11 |
* |
| 12 | 12 |
0000: MOVLW 02 |
| 13 | 13 |
0001: MOVWF 0A |
| 14 |
0002: GOTO 250
|
|
| 14 |
0002: GOTO 24F
|
|
| 15 | 15 |
0003: NOP |
| 16 | 16 |
.................... #include "main.h" |
| 17 | 17 |
.................... #include <16F887.h> |
| ... | ... | |
| 48 | 48 |
0026: MOVWF 07 |
| 49 | 49 |
0027: NOP |
| 50 | 50 |
0028: BCF 03.5 |
| 51 |
0029: RLF 32,F
|
|
| 51 |
0029: RLF 3D,F
|
|
| 52 | 52 |
002A: BCF 07.4 |
| 53 | 53 |
002B: BTFSS 03.0 |
| 54 | 54 |
002C: GOTO 033 |
| ... | ... | |
| 113 | 113 |
0067: BCF 03.5 |
| 114 | 114 |
0068: RETURN |
| 115 | 115 |
* |
| 116 |
010C: MOVLW 08
|
|
| 117 |
010D: MOVWF 33
|
|
| 118 |
010E: MOVF 77,W
|
|
| 119 |
010F: MOVWF 34
|
|
| 120 |
0110: BSF 20.4
|
|
| 121 |
0111: MOVF 20,W
|
|
| 122 |
0112: BSF 03.5
|
|
| 123 |
0113: MOVWF 07
|
|
| 124 |
0114: NOP
|
|
| 125 |
0115: BCF 03.5
|
|
| 126 |
0116: BSF 20.3
|
|
| 127 |
0117: MOVF 20,W
|
|
| 128 |
0118: BSF 03.5
|
|
| 129 |
0119: MOVWF 07
|
|
| 130 |
011A: BCF 03.5
|
|
| 131 |
011B: BTFSS 07.3
|
|
| 132 |
011C: GOTO 11B
|
|
| 133 |
011D: BTFSC 07.4
|
|
| 134 |
011E: BSF 03.0
|
|
| 135 |
011F: BTFSS 07.4
|
|
| 136 |
0120: BCF 03.0
|
|
| 137 |
0121: RLF 78,F
|
|
| 138 |
0122: NOP
|
|
| 139 |
0123: BCF 20.3
|
|
| 140 |
0124: MOVF 20,W
|
|
| 141 |
0125: BSF 03.5
|
|
| 142 |
0126: MOVWF 07
|
|
| 143 |
0127: BCF 03.5
|
|
| 144 |
0128: BCF 07.3
|
|
| 145 |
0129: DECFSZ 33,F
|
|
| 146 |
012A: GOTO 110
|
|
| 147 |
012B: BSF 20.4
|
|
| 148 |
012C: MOVF 20,W
|
|
| 149 |
012D: BSF 03.5
|
|
| 150 |
012E: MOVWF 07
|
|
| 151 |
012F: NOP
|
|
| 152 |
0130: BCF 03.5
|
|
| 153 |
0131: BCF 07.4
|
|
| 154 |
0132: MOVF 34,W
|
|
| 155 |
0133: BTFSC 03.2
|
|
| 156 |
0134: GOTO 13A
|
|
| 157 |
0135: BCF 20.4
|
|
| 158 |
0136: MOVF 20,W
|
|
| 159 |
0137: BSF 03.5
|
|
| 160 |
0138: MOVWF 07
|
|
| 161 |
0139: BCF 03.5
|
|
| 162 |
013A: NOP
|
|
| 163 |
013B: BSF 20.3
|
|
| 164 |
013C: MOVF 20,W
|
|
| 165 |
013D: BSF 03.5
|
|
| 166 |
013E: MOVWF 07
|
|
| 167 |
013F: BCF 03.5
|
|
| 168 |
0140: BTFSS 07.3
|
|
| 169 |
0141: GOTO 140
|
|
| 170 |
0142: NOP
|
|
| 171 |
0143: BCF 07.3
|
|
| 172 |
0144: BCF 20.3
|
|
| 173 |
0145: MOVF 20,W
|
|
| 174 |
0146: BSF 03.5
|
|
| 175 |
0147: MOVWF 07
|
|
| 176 |
0148: NOP
|
|
| 177 |
0149: BCF 03.5
|
|
| 178 |
014A: BCF 07.4
|
|
| 179 |
014B: BCF 20.4
|
|
| 180 |
014C: MOVF 20,W
|
|
| 181 |
014D: BSF 03.5
|
|
| 182 |
014E: MOVWF 07
|
|
| 183 |
014F: BCF 03.5
|
|
| 184 |
0150: RETURN
|
|
| 185 |
.................... #use rs232(baud=9600,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) //rcv TXD xmit RXD
|
|
| 116 |
010B: MOVLW 08
|
|
| 117 |
010C: MOVWF 3E
|
|
| 118 |
010D: MOVF 77,W
|
|
| 119 |
010E: MOVWF 3F
|
|
| 120 |
010F: BSF 20.4
|
|
| 121 |
0110: MOVF 20,W
|
|
| 122 |
0111: BSF 03.5
|
|
| 123 |
0112: MOVWF 07
|
|
| 124 |
0113: NOP
|
|
| 125 |
0114: BCF 03.5
|
|
| 126 |
0115: BSF 20.3
|
|
| 127 |
0116: MOVF 20,W
|
|
| 128 |
0117: BSF 03.5
|
|
| 129 |
0118: MOVWF 07
|
|
| 130 |
0119: BCF 03.5
|
|
| 131 |
011A: BTFSS 07.3
|
|
| 132 |
011B: GOTO 11A
|
|
| 133 |
011C: BTFSC 07.4
|
|
| 134 |
011D: BSF 03.0
|
|
| 135 |
011E: BTFSS 07.4
|
|
| 136 |
011F: BCF 03.0
|
|
| 137 |
0120: RLF 78,F
|
|
| 138 |
0121: NOP
|
|
| 139 |
0122: BCF 20.3
|
|
| 140 |
0123: MOVF 20,W
|
|
| 141 |
0124: BSF 03.5
|
|
| 142 |
0125: MOVWF 07
|
|
| 143 |
0126: BCF 03.5
|
|
| 144 |
0127: BCF 07.3
|
|
| 145 |
0128: DECFSZ 3E,F
|
|
| 146 |
0129: GOTO 10F
|
|
| 147 |
012A: BSF 20.4
|
|
| 148 |
012B: MOVF 20,W
|
|
| 149 |
012C: BSF 03.5
|
|
| 150 |
012D: MOVWF 07
|
|
| 151 |
012E: NOP
|
|
| 152 |
012F: BCF 03.5
|
|
| 153 |
0130: BCF 07.4
|
|
| 154 |
0131: MOVF 3F,W
|
|
| 155 |
0132: BTFSC 03.2
|
|
| 156 |
0133: GOTO 139
|
|
| 157 |
0134: BCF 20.4
|
|
| 158 |
0135: MOVF 20,W
|
|
| 159 |
0136: BSF 03.5
|
|
| 160 |
0137: MOVWF 07
|
|
| 161 |
0138: BCF 03.5
|
|
| 162 |
0139: NOP
|
|
| 163 |
013A: BSF 20.3
|
|
| 164 |
013B: MOVF 20,W
|
|
| 165 |
013C: BSF 03.5
|
|
| 166 |
013D: MOVWF 07
|
|
| 167 |
013E: BCF 03.5
|
|
| 168 |
013F: BTFSS 07.3
|
|
| 169 |
0140: GOTO 13F
|
|
| 170 |
0141: NOP
|
|
| 171 |
0142: BCF 07.3
|
|
| 172 |
0143: BCF 20.3
|
|
| 173 |
0144: MOVF 20,W
|
|
| 174 |
0145: BSF 03.5
|
|
| 175 |
0146: MOVWF 07
|
|
| 176 |
0147: NOP
|
|
| 177 |
0148: BCF 03.5
|
|
| 178 |
0149: BCF 07.4
|
|
| 179 |
014A: BCF 20.4
|
|
| 180 |
014B: MOVF 20,W
|
|
| 181 |
014C: BSF 03.5
|
|
| 182 |
014D: MOVWF 07
|
|
| 183 |
014E: BCF 03.5
|
|
| 184 |
014F: RETURN
|
|
| 185 |
.................... #use rs232(baud=115200,parity=N,xmit=PIN_C7,rcv=PIN_C6,bits=8) //rcv TXD xmit RXD
|
|
| 186 | 186 |
* |
| 187 | 187 |
00A2: BCF 20.7 |
| 188 | 188 |
00A3: MOVF 20,W |
| ... | ... | |
| 195 | 195 |
00AA: GOTO 0AB |
| 196 | 196 |
00AB: NOP |
| 197 | 197 |
00AC: BSF 78.7 |
| 198 |
00AD: GOTO 0BC
|
|
| 198 |
00AD: GOTO 0C0
|
|
| 199 | 199 |
00AE: BCF 78.7 |
| 200 |
00AF: RRF 35,F |
|
| 201 |
00B0: BTFSC 03.0 |
|
| 202 |
00B1: BSF 07.7 |
|
| 203 |
00B2: BTFSS 03.0 |
|
| 204 |
00B3: BCF 07.7 |
|
| 205 |
00B4: BSF 78.6 |
|
| 206 |
00B5: GOTO 0BC |
|
| 207 |
00B6: BCF 78.6 |
|
| 208 |
00B7: DECFSZ 78,F |
|
| 209 |
00B8: GOTO 0AF |
|
| 210 |
00B9: GOTO 0BA |
|
| 211 |
00BA: NOP |
|
| 212 |
00BB: BSF 07.7 |
|
| 213 |
00BC: MOVLW 3F |
|
| 214 |
00BD: MOVWF 04 |
|
| 215 |
00BE: DECFSZ 04,F |
|
| 216 |
00BF: GOTO 0BE |
|
| 217 |
00C0: NOP |
|
| 218 |
00C1: BTFSC 78.7 |
|
| 219 |
00C2: GOTO 0AE |
|
| 220 |
00C3: BTFSC 78.6 |
|
| 221 |
00C4: GOTO 0B6 |
|
| 222 |
00C5: RETURN |
|
| 200 |
00AF: MOVF 40,W |
|
| 201 |
00B0: MOVWF 79 |
|
| 202 |
00B1: RRF 79,F |
|
| 203 |
00B2: BTFSC 03.0 |
|
| 204 |
00B3: BSF 07.7 |
|
| 205 |
00B4: BTFSS 03.0 |
|
| 206 |
00B5: BCF 07.7 |
|
| 207 |
00B6: BSF 78.6 |
|
| 208 |
00B7: GOTO 0C0 |
|
| 209 |
00B8: BCF 78.6 |
|
| 210 |
00B9: DECFSZ 78,F |
|
| 211 |
00BA: GOTO 0B1 |
|
| 212 |
00BB: MOVF 79,W |
|
| 213 |
00BC: MOVWF 40 |
|
| 214 |
00BD: GOTO 0BE |
|
| 215 |
00BE: NOP |
|
| 216 |
00BF: BSF 07.7 |
|
| 217 |
00C0: BTFSC 78.7 |
|
| 218 |
00C1: GOTO 0AE |
|
| 219 |
00C2: BTFSC 78.6 |
|
| 220 |
00C3: GOTO 0B8 |
|
| 221 |
00C4: RETURN |
|
| 223 | 222 |
.................... |
| 224 | 223 |
.................... |
| 225 | 224 |
.................... #include "HMC5883L.h" |
| ... | ... | |
| 284 | 283 |
.................... i2c_write(HMC5883L_WRT_ADDR); |
| 285 | 284 |
0081: MOVLW 3C |
| 286 | 285 |
0082: BCF 03.5 |
| 287 |
0083: MOVWF 32
|
|
| 286 |
0083: MOVWF 3D
|
|
| 288 | 287 |
0084: CALL 01F |
| 289 | 288 |
.................... i2c_write(reg); |
| 290 |
0085: MOVF 2C,W
|
|
| 291 |
0086: MOVWF 32
|
|
| 289 |
0085: MOVF 37,W
|
|
| 290 |
0086: MOVWF 3D
|
|
| 292 | 291 |
0087: CALL 01F |
| 293 | 292 |
.................... i2c_write(data); |
| 294 |
0088: MOVF 2D,W
|
|
| 295 |
0089: MOVWF 32
|
|
| 293 |
0088: MOVF 38,W
|
|
| 294 |
0089: MOVWF 3D
|
|
| 296 | 295 |
008A: CALL 01F |
| 297 | 296 |
.................... i2c_stop(); |
| 298 | 297 |
008B: BCF 20.4 |
| ... | ... | |
| 348 | 347 |
.................... // from the HMC5883L x,y,z registers. |
| 349 | 348 |
.................... hmc5883l_result compass = {0,0,0};
|
| 350 | 349 |
* |
| 351 |
0271: CLRF 21
|
|
| 352 |
0272: CLRF 22
|
|
| 353 |
0273: CLRF 23
|
|
| 354 |
0274: CLRF 24
|
|
| 355 |
0275: CLRF 25
|
|
| 356 |
0276: CLRF 26
|
|
| 350 |
0270: CLRF 21
|
|
| 351 |
0271: CLRF 22
|
|
| 352 |
0272: CLRF 23
|
|
| 353 |
0273: CLRF 24
|
|
| 354 |
0274: CLRF 25
|
|
| 355 |
0275: CLRF 26
|
|
| 357 | 356 |
.................... |
| 358 | 357 |
.................... //------------------------------ |
| 359 | 358 |
.................... void hmc5883l_read_data(void) |
| ... | ... | |
| 369 | 368 |
.................... |
| 370 | 369 |
.................... i2c_start(); |
| 371 | 370 |
* |
| 372 |
0151: BSF 20.4
|
|
| 373 |
0152: MOVF 20,W
|
|
| 374 |
0153: BSF 03.5
|
|
| 375 |
0154: MOVWF 07
|
|
| 376 |
0155: NOP
|
|
| 377 |
0156: BCF 03.5
|
|
| 378 |
0157: BSF 20.3
|
|
| 379 |
0158: MOVF 20,W
|
|
| 380 |
0159: BSF 03.5
|
|
| 381 |
015A: MOVWF 07
|
|
| 382 |
015B: NOP
|
|
| 383 |
015C: BCF 03.5
|
|
| 384 |
015D: BCF 07.4
|
|
| 385 |
015E: BCF 20.4
|
|
| 386 |
015F: MOVF 20,W
|
|
| 387 |
0160: BSF 03.5
|
|
| 388 |
0161: MOVWF 07
|
|
| 389 |
0162: NOP
|
|
| 390 |
0163: BCF 03.5
|
|
| 391 |
0164: BCF 07.3
|
|
| 392 |
0165: BCF 20.3
|
|
| 393 |
0166: MOVF 20,W
|
|
| 394 |
0167: BSF 03.5
|
|
| 395 |
0168: MOVWF 07
|
|
| 371 |
0150: BSF 20.4
|
|
| 372 |
0151: MOVF 20,W
|
|
| 373 |
0152: BSF 03.5
|
|
| 374 |
0153: MOVWF 07
|
|
| 375 |
0154: NOP
|
|
| 376 |
0155: BCF 03.5
|
|
| 377 |
0156: BSF 20.3
|
|
| 378 |
0157: MOVF 20,W
|
|
| 379 |
0158: BSF 03.5
|
|
| 380 |
0159: MOVWF 07
|
|
| 381 |
015A: NOP
|
|
| 382 |
015B: BCF 03.5
|
|
| 383 |
015C: BCF 07.4
|
|
| 384 |
015D: BCF 20.4
|
|
| 385 |
015E: MOVF 20,W
|
|
| 386 |
015F: BSF 03.5
|
|
| 387 |
0160: MOVWF 07
|
|
| 388 |
0161: NOP
|
|
| 389 |
0162: BCF 03.5
|
|
| 390 |
0163: BCF 07.3
|
|
| 391 |
0164: BCF 20.3
|
|
| 392 |
0165: MOVF 20,W
|
|
| 393 |
0166: BSF 03.5
|
|
| 394 |
0167: MOVWF 07
|
|
| 396 | 395 |
.................... i2c_write(HMC5883L_WRT_ADDR); |
| 397 |
0169: MOVLW 3C
|
|
| 398 |
016A: BCF 03.5
|
|
| 399 |
016B: MOVWF 32
|
|
| 400 |
016C: CALL 01F
|
|
| 396 |
0168: MOVLW 3C
|
|
| 397 |
0169: BCF 03.5
|
|
| 398 |
016A: MOVWF 3D
|
|
| 399 |
016B: CALL 01F
|
|
| 401 | 400 |
.................... i2c_write(HMC5883L_X_MSB_REG); // Point to X-msb register |
| 402 |
016D: MOVLW 03
|
|
| 403 |
016E: MOVWF 32
|
|
| 404 |
016F: CALL 01F
|
|
| 401 |
016C: MOVLW 03
|
|
| 402 |
016D: MOVWF 3D
|
|
| 403 |
016E: CALL 01F
|
|
| 405 | 404 |
.................... i2c_start(); |
| 406 |
0170: BSF 20.4
|
|
| 407 |
0171: MOVF 20,W
|
|
| 408 |
0172: BSF 03.5
|
|
| 409 |
0173: MOVWF 07
|
|
| 410 |
0174: NOP
|
|
| 411 |
0175: BCF 03.5
|
|
| 412 |
0176: BSF 20.3
|
|
| 413 |
0177: MOVF 20,W
|
|
| 414 |
0178: BSF 03.5
|
|
| 415 |
0179: MOVWF 07
|
|
| 416 |
017A: NOP
|
|
| 417 |
017B: BCF 03.5
|
|
| 418 |
017C: BTFSS 07.3
|
|
| 419 |
017D: GOTO 17C
|
|
| 420 |
017E: BCF 07.4
|
|
| 421 |
017F: BCF 20.4
|
|
| 422 |
0180: MOVF 20,W
|
|
| 423 |
0181: BSF 03.5
|
|
| 424 |
0182: MOVWF 07
|
|
| 425 |
0183: NOP
|
|
| 426 |
0184: BCF 03.5
|
|
| 427 |
0185: BCF 07.3
|
|
| 428 |
0186: BCF 20.3
|
|
| 429 |
0187: MOVF 20,W
|
|
| 430 |
0188: BSF 03.5
|
|
| 431 |
0189: MOVWF 07
|
|
| 405 |
016F: BSF 20.4
|
|
| 406 |
0170: MOVF 20,W
|
|
| 407 |
0171: BSF 03.5
|
|
| 408 |
0172: MOVWF 07
|
|
| 409 |
0173: NOP
|
|
| 410 |
0174: BCF 03.5
|
|
| 411 |
0175: BSF 20.3
|
|
| 412 |
0176: MOVF 20,W
|
|
| 413 |
0177: BSF 03.5
|
|
| 414 |
0178: MOVWF 07
|
|
| 415 |
0179: NOP
|
|
| 416 |
017A: BCF 03.5
|
|
| 417 |
017B: BTFSS 07.3
|
|
| 418 |
017C: GOTO 17B
|
|
| 419 |
017D: BCF 07.4
|
|
| 420 |
017E: BCF 20.4
|
|
| 421 |
017F: MOVF 20,W
|
|
| 422 |
0180: BSF 03.5
|
|
| 423 |
0181: MOVWF 07
|
|
| 424 |
0182: NOP
|
|
| 425 |
0183: BCF 03.5
|
|
| 426 |
0184: BCF 07.3
|
|
| 427 |
0185: BCF 20.3
|
|
| 428 |
0186: MOVF 20,W
|
|
| 429 |
0187: BSF 03.5
|
|
| 430 |
0188: MOVWF 07
|
|
| 432 | 431 |
.................... i2c_write(HMC5883L_READ_ADDR); |
| 433 |
018A: MOVLW 3D
|
|
| 434 |
018B: BCF 03.5
|
|
| 435 |
018C: MOVWF 32
|
|
| 436 |
018D: CALL 01F
|
|
| 432 |
0189: MOVLW 3D
|
|
| 433 |
018A: BCF 03.5
|
|
| 434 |
018B: MOVWF 3D
|
|
| 435 |
018C: CALL 01F
|
|
| 437 | 436 |
.................... |
| 438 | 437 |
.................... x_msb = i2c_read(); |
| 439 |
018E: MOVLW 01
|
|
| 440 |
018F: MOVWF 77
|
|
| 441 |
0190: CALL 10C
|
|
| 442 |
0191: MOVF 78,W
|
|
| 443 |
0192: MOVWF 2D
|
|
| 438 |
018D: MOVLW 01
|
|
| 439 |
018E: MOVWF 77
|
|
| 440 |
018F: CALL 10B
|
|
| 441 |
0190: MOVF 78,W
|
|
| 442 |
0191: MOVWF 38
|
|
| 444 | 443 |
.................... x_lsb = i2c_read(); |
| 445 |
0193: MOVLW 01
|
|
| 446 |
0194: MOVWF 77
|
|
| 447 |
0195: CALL 10C
|
|
| 448 |
0196: MOVF 78,W
|
|
| 449 |
0197: MOVWF 2C
|
|
| 444 |
0192: MOVLW 01
|
|
| 445 |
0193: MOVWF 77
|
|
| 446 |
0194: CALL 10B
|
|
| 447 |
0195: MOVF 78,W
|
|
| 448 |
0196: MOVWF 37
|
|
| 450 | 449 |
.................... |
| 451 | 450 |
.................... z_msb = i2c_read(); |
| 452 |
0198: MOVLW 01
|
|
| 453 |
0199: MOVWF 77
|
|
| 454 |
019A: CALL 10C
|
|
| 455 |
019B: MOVF 78,W
|
|
| 456 |
019C: MOVWF 31
|
|
| 451 |
0197: MOVLW 01
|
|
| 452 |
0198: MOVWF 77
|
|
| 453 |
0199: CALL 10B
|
|
| 454 |
019A: MOVF 78,W
|
|
| 455 |
019B: MOVWF 3C
|
|
| 457 | 456 |
.................... z_lsb = i2c_read(); |
| 458 |
019D: MOVLW 01
|
|
| 459 |
019E: MOVWF 77
|
|
| 460 |
019F: CALL 10C
|
|
| 461 |
01A0: MOVF 78,W
|
|
| 462 |
01A1: MOVWF 30
|
|
| 457 |
019C: MOVLW 01
|
|
| 458 |
019D: MOVWF 77
|
|
| 459 |
019E: CALL 10B
|
|
| 460 |
019F: MOVF 78,W
|
|
| 461 |
01A0: MOVWF 3B
|
|
| 463 | 462 |
.................... |
| 464 | 463 |
.................... y_msb = i2c_read(); |
| 465 |
01A2: MOVLW 01
|
|
| 466 |
01A3: MOVWF 77
|
|
| 467 |
01A4: CALL 10C
|
|
| 468 |
01A5: MOVF 78,W
|
|
| 469 |
01A6: MOVWF 2F
|
|
| 464 |
01A1: MOVLW 01
|
|
| 465 |
01A2: MOVWF 77
|
|
| 466 |
01A3: CALL 10B
|
|
| 467 |
01A4: MOVF 78,W
|
|
| 468 |
01A5: MOVWF 3A
|
|
| 470 | 469 |
.................... y_lsb = i2c_read(0); // do a NACK on last read |
| 471 |
01A7: CLRF 77
|
|
| 472 |
01A8: CALL 10C
|
|
| 473 |
01A9: MOVF 78,W
|
|
| 474 |
01AA: MOVWF 2E
|
|
| 470 |
01A6: CLRF 77
|
|
| 471 |
01A7: CALL 10B
|
|
| 472 |
01A8: MOVF 78,W
|
|
| 473 |
01A9: MOVWF 39
|
|
| 475 | 474 |
.................... |
| 476 | 475 |
.................... i2c_stop(); |
| 477 |
01AB: BCF 20.4
|
|
| 478 |
01AC: MOVF 20,W
|
|
| 479 |
01AD: BSF 03.5
|
|
| 480 |
01AE: MOVWF 07
|
|
| 481 |
01AF: NOP
|
|
| 482 |
01B0: BCF 03.5
|
|
| 483 |
01B1: BSF 20.3
|
|
| 484 |
01B2: MOVF 20,W
|
|
| 485 |
01B3: BSF 03.5
|
|
| 486 |
01B4: MOVWF 07
|
|
| 487 |
01B5: BCF 03.5
|
|
| 488 |
01B6: BTFSS 07.3
|
|
| 489 |
01B7: GOTO 1B6
|
|
| 490 |
01B8: NOP
|
|
| 491 |
01B9: GOTO 1BA
|
|
| 492 |
01BA: NOP
|
|
| 493 |
01BB: BSF 20.4
|
|
| 494 |
01BC: MOVF 20,W
|
|
| 495 |
01BD: BSF 03.5
|
|
| 496 |
01BE: MOVWF 07
|
|
| 497 |
01BF: NOP
|
|
| 476 |
01AA: BCF 20.4
|
|
| 477 |
01AB: MOVF 20,W
|
|
| 478 |
01AC: BSF 03.5
|
|
| 479 |
01AD: MOVWF 07
|
|
| 480 |
01AE: NOP
|
|
| 481 |
01AF: BCF 03.5
|
|
| 482 |
01B0: BSF 20.3
|
|
| 483 |
01B1: MOVF 20,W
|
|
| 484 |
01B2: BSF 03.5
|
|
| 485 |
01B3: MOVWF 07
|
|
| 486 |
01B4: BCF 03.5
|
|
| 487 |
01B5: BTFSS 07.3
|
|
| 488 |
01B6: GOTO 1B5
|
|
| 489 |
01B7: NOP
|
|
| 490 |
01B8: GOTO 1B9
|
|
| 491 |
01B9: NOP
|
|
| 492 |
01BA: BSF 20.4
|
|
| 493 |
01BB: MOVF 20,W
|
|
| 494 |
01BC: BSF 03.5
|
|
| 495 |
01BD: MOVWF 07
|
|
| 496 |
01BE: NOP
|
|
| 498 | 497 |
.................... |
| 499 | 498 |
.................... // Combine high and low bytes into 16-bit values. |
| 500 | 499 |
.................... compass.x = make16(x_msb, x_lsb); |
| 501 |
01C0: BCF 03.5
|
|
| 502 |
01C1: MOVF 2D,W
|
|
| 503 |
01C2: MOVWF 22
|
|
| 504 |
01C3: MOVF 2C,W
|
|
| 505 |
01C4: MOVWF 21
|
|
| 500 |
01BF: BCF 03.5
|
|
| 501 |
01C0: MOVF 38,W
|
|
| 502 |
01C1: MOVWF 22
|
|
| 503 |
01C2: MOVF 37,W
|
|
| 504 |
01C3: MOVWF 21
|
|
| 506 | 505 |
.................... compass.y = make16(y_msb, y_lsb); |
| 507 |
01C5: MOVF 2F,W
|
|
| 508 |
01C6: MOVWF 24
|
|
| 509 |
01C7: MOVF 2E,W
|
|
| 510 |
01C8: MOVWF 23
|
|
| 506 |
01C4: MOVF 3A,W
|
|
| 507 |
01C5: MOVWF 24
|
|
| 508 |
01C6: MOVF 39,W
|
|
| 509 |
01C7: MOVWF 23
|
|
| 511 | 510 |
.................... compass.z = make16(z_msb, z_lsb); |
| 512 |
01C9: MOVF 31,W
|
|
| 513 |
01CA: MOVWF 26
|
|
| 514 |
01CB: MOVF 30,W
|
|
| 515 |
01CC: MOVWF 25
|
|
| 511 |
01C8: MOVF 3C,W
|
|
| 512 |
01C9: MOVWF 26
|
|
| 513 |
01CA: MOVF 3B,W
|
|
| 514 |
01CB: MOVWF 25
|
|
| 516 | 515 |
.................... } |
| 517 |
01CD: BCF 0A.3
|
|
| 518 |
01CE: BCF 0A.4
|
|
| 519 |
01CF: GOTO 2EE (RETURN)
|
|
| 516 |
01CC: BCF 0A.3
|
|
| 517 |
01CD: BCF 0A.4
|
|
| 518 |
01CE: GOTO 2E1 (RETURN)
|
|
| 520 | 519 |
.................... |
| 521 | 520 |
.................... |
| 522 | 521 |
.................... |
| 523 | 522 |
.................... |
| 523 |
.................... #include <math.h> |
|
| 524 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 525 |
.................... //// (C) Copyright 1996,2008 Custom Computer Services //// |
|
| 526 |
.................... //// This source code may only be used by licensed users of the CCS C //// |
|
| 527 |
.................... //// compiler. This source code may only be distributed to other //// |
|
| 528 |
.................... //// licensed users of the CCS C compiler. No other use, reproduction //// |
|
| 529 |
.................... //// or distribution is permitted without written permission. //// |
|
| 530 |
.................... //// Derivative programs created using this software in object code //// |
|
| 531 |
.................... //// form are not restricted in any way. //// |
|
| 532 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 533 |
.................... //// //// |
|
| 534 |
.................... //// History: //// |
|
| 535 |
.................... //// * 9/20/2001 : Improvments are made to sin/cos code. //// |
|
| 536 |
.................... //// The code now is small, much faster, //// |
|
| 537 |
.................... //// and more accurate. //// |
|
| 538 |
.................... //// * 2/21/2007 : Compiler handles & operator differently and does |
|
| 539 |
.................... //// not return generic (int8 *) so type cast is done //// |
|
| 540 |
.................... //// //// |
|
| 541 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 524 | 542 |
.................... |
| 543 |
.................... #ifndef MATH_H |
|
| 544 |
.................... #define MATH_H |
|
| 545 |
.................... |
|
| 546 |
.................... #ifdef PI |
|
| 547 |
.................... #undef PI |
|
| 548 |
.................... #endif |
|
| 549 |
.................... #define PI 3.1415926535897932 |
|
| 550 |
.................... |
|
| 551 |
.................... |
|
| 552 |
.................... #define SQRT2 1.4142135623730950 |
|
| 553 |
.................... |
|
| 554 |
.................... //float const ps[4] = {5.9304945, 21.125224, 8.9403076, 0.29730279};
|
|
| 555 |
.................... //float const qs[4] = {1.0000000, 15.035723, 17.764134, 2.4934718};
|
|
| 556 |
.................... |
|
| 557 |
.................... ///////////////////////////// Round Functions ////////////////////////////// |
|
| 558 |
.................... |
|
| 559 |
.................... float32 CEIL_FLOOR(float32 x, unsigned int8 n) |
|
| 560 |
.................... {
|
|
| 561 |
.................... float32 y, res; |
|
| 562 |
.................... unsigned int16 l; |
|
| 563 |
.................... int1 s; |
|
| 564 |
.................... |
|
| 565 |
.................... s = 0; |
|
| 566 |
.................... y = x; |
|
| 567 |
.................... |
|
| 568 |
.................... if (x < 0) |
|
| 569 |
.................... {
|
|
| 570 |
.................... s = 1; |
|
| 571 |
.................... y = -y; |
|
| 572 |
.................... } |
|
| 573 |
.................... |
|
| 574 |
.................... if (y <= 32768.0) |
|
| 575 |
.................... res = (float32)(unsigned int16)y; |
|
| 576 |
.................... |
|
| 577 |
.................... else if (y < 10000000.0) |
|
| 578 |
.................... {
|
|
| 579 |
.................... l = (unsigned int16)(y/32768.0); |
|
| 580 |
.................... y = 32768.0*(y/32768.0 - (float32)l); |
|
| 581 |
.................... res = 32768.0*(float32)l; |
|
| 582 |
.................... res += (float32)(unsigned int16)y; |
|
| 583 |
.................... } |
|
| 584 |
.................... |
|
| 585 |
.................... else |
|
| 586 |
.................... res = y; |
|
| 587 |
.................... |
|
| 588 |
.................... y = y - (float32)(unsigned int16)y; |
|
| 589 |
.................... |
|
| 590 |
.................... if (s) |
|
| 591 |
.................... res = -res; |
|
| 592 |
.................... |
|
| 593 |
.................... if (y != 0) |
|
| 594 |
.................... {
|
|
| 595 |
.................... if (s == 1 && n == 0) |
|
| 596 |
.................... res -= 1.0; |
|
| 597 |
.................... |
|
| 598 |
.................... if (s == 0 && n == 1) |
|
| 599 |
.................... res += 1.0; |
|
| 600 |
.................... } |
|
| 601 |
.................... if (x == 0) |
|
| 602 |
.................... res = 0; |
|
| 603 |
.................... |
|
| 604 |
.................... return (res); |
|
| 605 |
.................... } |
|
| 606 |
.................... |
|
| 607 |
.................... // Overloaded Functions to take care for new Data types in PCD |
|
| 608 |
.................... // Overloaded function CEIL_FLOOR() for data type - Float48 |
|
| 609 |
.................... #if defined(__PCD__) |
|
| 610 |
.................... float48 CEIL_FLOOR(float48 x, unsigned int8 n) |
|
| 611 |
.................... {
|
|
| 612 |
.................... float48 y, res; |
|
| 613 |
.................... unsigned int16 l; |
|
| 614 |
.................... int1 s; |
|
| 615 |
.................... |
|
| 616 |
.................... s = 0; |
|
| 617 |
.................... y = x; |
|
| 618 |
.................... |
|
| 619 |
.................... if (x < 0) |
|
| 620 |
.................... {
|
|
| 621 |
.................... s = 1; |
|
| 622 |
.................... y = -y; |
|
| 623 |
.................... } |
|
| 624 |
.................... |
|
| 625 |
.................... if (y <= 32768.0) |
|
| 626 |
.................... res = (float48)(unsigned int16)y; |
|
| 627 |
.................... |
|
| 628 |
.................... else if (y < 10000000.0) |
|
| 629 |
.................... {
|
|
| 630 |
.................... l = (unsigned int16)(y/32768.0); |
|
| 631 |
.................... y = 32768.0*(y/32768.0 - (float48)l); |
|
| 632 |
.................... res = 32768.0*(float32)l; |
|
| 633 |
.................... res += (float48)(unsigned int16)y; |
|
| 634 |
.................... } |
|
| 635 |
.................... |
|
| 636 |
.................... else |
|
| 637 |
.................... res = y; |
|
| 638 |
.................... |
|
| 639 |
.................... y = y - (float48)(unsigned int16)y; |
|
| 640 |
.................... |
|
| 641 |
.................... if (s) |
|
| 642 |
.................... res = -res; |
|
| 643 |
.................... |
|
| 644 |
.................... if (y != 0) |
|
| 645 |
.................... {
|
|
| 646 |
.................... if (s == 1 && n == 0) |
|
| 647 |
.................... res -= 1.0; |
|
| 648 |
.................... |
|
| 649 |
.................... if (s == 0 && n == 1) |
|
| 650 |
.................... res += 1.0; |
|
| 651 |
.................... } |
|
| 652 |
.................... if (x == 0) |
|
| 653 |
.................... res = 0; |
|
| 654 |
.................... |
|
| 655 |
.................... return (res); |
|
| 656 |
.................... } |
|
| 657 |
.................... |
|
| 658 |
.................... |
|
| 659 |
.................... // Overloaded function CEIL_FLOOR() for data type - Float64 |
|
| 660 |
.................... float64 CEIL_FLOOR(float64 x, unsigned int8 n) |
|
| 661 |
.................... {
|
|
| 662 |
.................... float64 y, res; |
|
| 663 |
.................... unsigned int16 l; |
|
| 664 |
.................... int1 s; |
|
| 665 |
.................... |
|
| 666 |
.................... s = 0; |
|
| 667 |
.................... y = x; |
|
| 668 |
.................... |
|
| 669 |
.................... if (x < 0) |
|
| 670 |
.................... {
|
|
| 671 |
.................... s = 1; |
|
| 672 |
.................... y = -y; |
|
| 673 |
.................... } |
|
| 674 |
.................... |
|
| 675 |
.................... if (y <= 32768.0) |
|
| 676 |
.................... res = (float64)(unsigned int16)y; |
|
| 677 |
.................... |
|
| 678 |
.................... else if (y < 10000000.0) |
|
| 679 |
.................... {
|
|
| 680 |
.................... l = (unsigned int16)(y/32768.0); |
|
| 681 |
.................... y = 32768.0*(y/32768.0 - (float64)l); |
|
| 682 |
.................... res = 32768.0*(float64)l; |
|
| 683 |
.................... res += (float64)(unsigned int16)y; |
|
| 684 |
.................... } |
|
| 685 |
.................... |
|
| 686 |
.................... else |
|
| 687 |
.................... res = y; |
|
| 688 |
.................... |
|
| 689 |
.................... y = y - (float64)(unsigned int16)y; |
|
| 690 |
.................... |
|
| 691 |
.................... if (s) |
|
| 692 |
.................... res = -res; |
|
| 693 |
.................... |
|
| 694 |
.................... if (y != 0) |
|
| 695 |
.................... {
|
|
| 696 |
.................... if (s == 1 && n == 0) |
|
| 697 |
.................... res -= 1.0; |
|
| 698 |
.................... |
|
| 699 |
.................... if (s == 0 && n == 1) |
|
| 700 |
.................... res += 1.0; |
|
| 701 |
.................... } |
|
| 702 |
.................... if (x == 0) |
|
| 703 |
.................... res = 0; |
|
| 704 |
.................... |
|
| 705 |
.................... return (res); |
|
| 706 |
.................... } |
|
| 707 |
.................... #endif |
|
| 708 |
.................... |
|
| 709 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 710 |
.................... // float floor(float x) |
|
| 711 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 712 |
.................... // Description : rounds down the number x. |
|
| 713 |
.................... // Date : N/A |
|
| 714 |
.................... // |
|
| 715 |
.................... float32 floor(float32 x) |
|
| 716 |
.................... {
|
|
| 717 |
.................... return CEIL_FLOOR(x, 0); |
|
| 718 |
.................... } |
|
| 719 |
.................... // Following 2 functions are overloaded functions of floor() for PCD |
|
| 720 |
.................... // Overloaded function floor() for data type - Float48 |
|
| 721 |
.................... #if defined(__PCD__) |
|
| 722 |
.................... float48 floor(float48 x) |
|
| 723 |
.................... {
|
|
| 724 |
.................... return CEIL_FLOOR(x, 0); |
|
| 725 |
.................... } |
|
| 726 |
.................... |
|
| 727 |
.................... // Overloaded function floor() for data type - Float64 |
|
| 728 |
.................... float64 floor(float64 x) |
|
| 729 |
.................... {
|
|
| 730 |
.................... return CEIL_FLOOR(x, 0); |
|
| 731 |
.................... } |
|
| 732 |
.................... #endif |
|
| 733 |
.................... |
|
| 734 |
.................... |
|
| 735 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 736 |
.................... // float ceil(float x) |
|
| 737 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 738 |
.................... // Description : rounds up the number x. |
|
| 739 |
.................... // Date : N/A |
|
| 740 |
.................... // |
|
| 741 |
.................... float32 ceil(float32 x) |
|
| 742 |
.................... {
|
|
| 743 |
.................... return CEIL_FLOOR(x, 1); |
|
| 744 |
.................... } |
|
| 745 |
.................... // Following 2 functions are overloaded functions of ceil() for PCD |
|
| 746 |
.................... // Overloaded function ceil() for data type - Float48 |
|
| 747 |
.................... #if defined(__PCD__) |
|
| 748 |
.................... float48 ceil(float48 x) |
|
| 749 |
.................... {
|
|
| 750 |
.................... return CEIL_FLOOR(x, 1); |
|
| 751 |
.................... } |
|
| 752 |
.................... |
|
| 753 |
.................... // Overloaded function ceil() for data type - Float64 |
|
| 754 |
.................... float64 ceil(float64 x) |
|
| 755 |
.................... {
|
|
| 756 |
.................... return CEIL_FLOOR(x, 1); |
|
| 757 |
.................... } |
|
| 758 |
.................... #endif |
|
| 759 |
.................... |
|
| 760 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 761 |
.................... // float fabs(float x) |
|
| 762 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 763 |
.................... // Description : Computes the absolute value of floating point number x |
|
| 764 |
.................... // Returns : returns the absolute value of x |
|
| 765 |
.................... // Date : N/A |
|
| 766 |
.................... // |
|
| 767 |
.................... #define fabs abs |
|
| 768 |
.................... |
|
| 769 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 770 |
.................... // float fmod(float x) |
|
| 771 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 772 |
.................... // Description : Computes the floating point remainder of x/y |
|
| 773 |
.................... // Returns : returns the value of x= i*y, for some integer i such that, if y |
|
| 774 |
.................... // is non zero, the result has the same isgn of x na dmagnitude less than the |
|
| 775 |
.................... // magnitude of y. If y is zero then a domain error occurs. |
|
| 776 |
.................... // Date : N/A |
|
| 777 |
.................... // |
|
| 778 |
.................... |
|
| 779 |
.................... float fmod(float32 x,float32 y) |
|
| 780 |
.................... {
|
|
| 781 |
.................... float32 i; |
|
| 782 |
.................... if (y!=0.0) |
|
| 783 |
.................... {
|
|
| 784 |
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y); |
|
| 785 |
.................... return(x-(i*y)); |
|
| 786 |
.................... } |
|
| 787 |
.................... else |
|
| 788 |
.................... {
|
|
| 789 |
.................... #ifdef _ERRNO |
|
| 790 |
.................... {
|
|
| 791 |
.................... errno=EDOM; |
|
| 792 |
.................... } |
|
| 793 |
.................... #endif |
|
| 794 |
.................... } |
|
| 795 |
.................... } |
|
| 796 |
.................... //Overloaded function for fmod() for PCD |
|
| 797 |
.................... // Overloaded function fmod() for data type - Float48 |
|
| 798 |
.................... #if defined(__PCD__) |
|
| 799 |
.................... float48 fmod(float48 x,float48 y) |
|
| 800 |
.................... {
|
|
| 801 |
.................... float48 i; |
|
| 802 |
.................... if (y!=0.0) |
|
| 803 |
.................... {
|
|
| 804 |
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y); |
|
| 805 |
.................... return(x-(i*y)); |
|
| 806 |
.................... } |
|
| 807 |
.................... else |
|
| 808 |
.................... {
|
|
| 809 |
.................... #ifdef _ERRNO |
|
| 810 |
.................... {
|
|
| 811 |
.................... errno=EDOM; |
|
| 812 |
.................... } |
|
| 813 |
.................... #endif |
|
| 814 |
.................... } |
|
| 815 |
.................... } |
|
| 816 |
.................... // Overloaded function fmod() for data type - Float64 |
|
| 817 |
.................... float64 fmod(float64 x,float64 y) |
|
| 818 |
.................... {
|
|
| 819 |
.................... float64 i; |
|
| 820 |
.................... if (y!=0.0) |
|
| 821 |
.................... {
|
|
| 822 |
.................... i=(x/y < 0.0)? ceil(x/y): floor(x/y); |
|
| 823 |
.................... return(x-(i*y)); |
|
| 824 |
.................... } |
|
| 825 |
.................... else |
|
| 826 |
.................... {
|
|
| 827 |
.................... #ifdef _ERRNO |
|
| 828 |
.................... {
|
|
| 829 |
.................... errno=EDOM; |
|
| 830 |
.................... } |
|
| 831 |
.................... #endif |
|
| 832 |
.................... } |
|
| 833 |
.................... } |
|
| 834 |
.................... #endif |
|
| 835 |
.................... //////////////////// Exponential and logarithmic functions //////////////////// |
|
| 836 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 837 |
.................... // float exp(float x) |
|
| 838 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 839 |
.................... // Description : returns the value (e^x) |
|
| 840 |
.................... // Date : N/A |
|
| 841 |
.................... // |
|
| 842 |
.................... #define LN2 0.6931471805599453 |
|
| 843 |
.................... |
|
| 844 |
.................... float const pe[6] = {0.000207455774, 0.00127100575, 0.00965065093,
|
|
| 845 |
.................... 0.0554965651, 0.240227138, 0.693147172}; |
|
| 846 |
.................... |
|
| 847 |
.................... |
|
| 848 |
.................... float32 exp(float32 x) |
|
| 849 |
.................... {
|
|
| 850 |
.................... float32 y, res, r; |
|
| 851 |
.................... #if defined(__PCD__) |
|
| 852 |
.................... int8 data1; |
|
| 853 |
.................... #endif |
|
| 854 |
.................... signed int8 n; |
|
| 855 |
.................... int1 s; |
|
| 856 |
.................... #ifdef _ERRNO |
|
| 857 |
.................... if(x > 88.722838) |
|
| 858 |
.................... {
|
|
| 859 |
.................... errno=ERANGE; |
|
| 860 |
.................... return(0); |
|
| 861 |
.................... } |
|
| 862 |
.................... #endif |
|
| 863 |
.................... n = (signed int16)(x/LN2); |
|
| 864 |
.................... s = 0; |
|
| 865 |
.................... y = x; |
|
| 866 |
.................... |
|
| 867 |
.................... if (x < 0) |
|
| 868 |
.................... {
|
|
| 869 |
.................... s = 1; |
|
| 870 |
.................... n = -n; |
|
| 871 |
.................... y = -y; |
|
| 872 |
.................... } |
|
| 873 |
.................... |
|
| 874 |
.................... res = 0.0; |
|
| 875 |
.................... #if !defined(__PCD__) |
|
| 876 |
.................... *((unsigned int8 *)(&res)) = n + 0x7F; |
|
| 877 |
.................... #endif |
|
| 878 |
.................... |
|
| 879 |
.................... #if defined(__PCD__) // Takes care of IEEE format for PCD |
|
| 880 |
.................... data1 = n+0x7F; |
|
| 881 |
.................... if(bit_test(data1,0)) |
|
| 882 |
.................... bit_set(*(((unsigned int8 *)(&res)+2)),7); |
|
| 883 |
.................... rotate_right(&data1,1); |
|
| 884 |
.................... bit_clear(data1,7); |
|
| 885 |
.................... *(((unsigned int8 *)(&res)+3)) = data1; |
|
| 886 |
.................... #endif |
|
| 887 |
.................... |
|
| 888 |
.................... y = y/LN2 - (float32)n; |
|
| 889 |
.................... |
|
| 890 |
.................... r = pe[0]*y + pe[1]; |
|
| 891 |
.................... r = r*y + pe[2]; |
|
| 892 |
.................... r = r*y + pe[3]; |
|
| 893 |
.................... r = r*y + pe[4]; |
|
| 894 |
.................... r = r*y + pe[5]; |
|
| 895 |
.................... |
|
| 896 |
.................... res = res*(1.0 + y*r); |
|
| 897 |
.................... |
|
| 898 |
.................... if (s) |
|
| 899 |
.................... res = 1.0/res; |
|
| 900 |
.................... return(res); |
|
| 901 |
.................... } |
|
| 902 |
.................... |
|
| 903 |
.................... |
|
| 904 |
.................... //Overloaded function for exp() for PCD |
|
| 905 |
.................... // Overloaded function exp() for data type - Float48 |
|
| 906 |
.................... #if defined(__PCD__) |
|
| 907 |
.................... float48 exp(float48 x) |
|
| 908 |
.................... {
|
|
| 909 |
.................... float48 y, res, r; |
|
| 910 |
.................... int8 data1; |
|
| 911 |
.................... signed int8 n; |
|
| 912 |
.................... int1 s; |
|
| 913 |
.................... #ifdef _ERRNO |
|
| 914 |
.................... if(x > 88.722838) |
|
| 915 |
.................... {
|
|
| 916 |
.................... errno=ERANGE; |
|
| 917 |
.................... return(0); |
|
| 918 |
.................... } |
|
| 919 |
.................... #endif |
|
| 920 |
.................... n = (signed int16)(x/LN2); |
|
| 921 |
.................... s = 0; |
|
| 922 |
.................... y = x; |
|
| 923 |
.................... |
|
| 924 |
.................... if (x < 0) |
|
| 925 |
.................... {
|
|
| 926 |
.................... s = 1; |
|
| 927 |
.................... n = -n; |
|
| 928 |
.................... y = -y; |
|
| 929 |
.................... } |
|
| 930 |
.................... |
|
| 931 |
.................... res = 0.0; |
|
| 932 |
.................... |
|
| 933 |
.................... data1 = n+0x7F; |
|
| 934 |
.................... if(bit_test(data1,0)) |
|
| 935 |
.................... bit_set(*(((unsigned int8 *)(&res)+4)),7); |
|
| 936 |
.................... rotate_right(&data1,1); |
|
| 937 |
.................... bit_clear(data1,7); |
|
| 938 |
.................... *(((unsigned int8 *)(&res)+5)) = data1; |
|
| 939 |
.................... |
|
| 940 |
.................... y = y/LN2 - (float48)n; |
|
| 941 |
.................... |
|
| 942 |
.................... r = pe[0]*y + pe[1]; |
|
| 943 |
.................... r = r*y + pe[2]; |
|
| 944 |
.................... r = r*y + pe[3]; |
|
| 945 |
.................... r = r*y + pe[4]; |
|
| 946 |
.................... r = r*y + pe[5]; |
|
| 947 |
.................... |
|
| 948 |
.................... res = res*(1.0 + y*r); |
|
| 949 |
.................... |
|
| 950 |
.................... if (s) |
|
| 951 |
.................... res = 1.0/res; |
|
| 952 |
.................... return(res); |
|
| 953 |
.................... } |
|
| 954 |
.................... |
|
| 955 |
.................... // Overloaded function exp() for data type - Float64 |
|
| 956 |
.................... float64 exp(float64 x) |
|
| 957 |
.................... {
|
|
| 958 |
.................... float64 y, res, r; |
|
| 959 |
.................... unsigned int16 data1, data2; |
|
| 960 |
.................... unsigned int16 *p; |
|
| 961 |
.................... signed int16 n; |
|
| 962 |
.................... int1 s; |
|
| 963 |
.................... #ifdef _ERRNO |
|
| 964 |
.................... if(x > 709.7827128) |
|
| 965 |
.................... {
|
|
| 966 |
.................... errno=ERANGE; |
|
| 967 |
.................... return(0); |
|
| 968 |
.................... } |
|
| 969 |
.................... #endif |
|
| 970 |
.................... n = (signed int16)(x/LN2); |
|
| 971 |
.................... s = 0; |
|
| 972 |
.................... y = x; |
|
| 973 |
.................... |
|
| 974 |
.................... if (x < 0) |
|
| 975 |
.................... {
|
|
| 976 |
.................... s = 1; |
|
| 977 |
.................... n = -n; |
|
| 978 |
.................... y = -y; |
|
| 979 |
.................... } |
|
| 980 |
.................... |
|
| 981 |
.................... res = 0.0; |
|
| 982 |
.................... |
|
| 983 |
.................... #if !defined(__PCD__) |
|
| 984 |
.................... *((unsigned int16 *)(&res)) = n + 0x7F; |
|
| 985 |
.................... #endif |
|
| 986 |
.................... p= (((unsigned int16 *)(&res))+3); |
|
| 987 |
.................... data1 = *p; |
|
| 988 |
.................... data2 = *p; |
|
| 989 |
.................... data1 = n + 0x3FF; |
|
| 990 |
.................... data1 = data1 <<4; |
|
| 991 |
.................... if(bit_test(data2,15)) |
|
| 992 |
.................... bit_set(data1,15); |
|
| 993 |
.................... data2 = data2 & 0x000F; |
|
| 994 |
.................... data1 ^= data2; |
|
| 995 |
.................... |
|
| 996 |
.................... *(((unsigned int16 *)(&res)+3)) = data1; |
|
| 997 |
.................... |
|
| 998 |
.................... |
|
| 999 |
.................... y = y/LN2 - (float64)n; |
|
| 1000 |
.................... |
|
| 1001 |
.................... r = pe[0]*y + pe[1]; |
|
| 1002 |
.................... r = r*y + pe[2]; |
|
| 1003 |
.................... r = r*y + pe[3]; |
|
| 1004 |
.................... r = r*y + pe[4]; |
|
| 1005 |
.................... r = r*y + pe[5]; |
|
| 1006 |
.................... |
|
| 1007 |
.................... res = res*(1.0 + y*r); |
|
| 1008 |
.................... |
|
| 1009 |
.................... if (s) |
|
| 1010 |
.................... res = 1.0/res; |
|
| 1011 |
.................... return(res); |
|
| 1012 |
.................... } |
|
| 1013 |
.................... |
|
| 1014 |
.................... #ENDIF |
|
| 1015 |
.................... |
|
| 1016 |
.................... |
|
| 1017 |
.................... /************************************************************/ |
|
| 1018 |
.................... |
|
| 1019 |
.................... float32 const pl[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};
|
|
| 1020 |
.................... float32 const ql[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};
|
|
| 1021 |
.................... |
|
| 1022 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1023 |
.................... // float log(float x) |
|
| 1024 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1025 |
.................... // Description : returns the the natural log of x |
|
| 1026 |
.................... // Date : N/A |
|
| 1027 |
.................... // |
|
| 1028 |
.................... float32 log(float32 x) |
|
| 1029 |
.................... {
|
|
| 1030 |
.................... float32 y, res, r, y2; |
|
| 1031 |
.................... #if defined(__PCD__) |
|
| 1032 |
.................... unsigned int8 data1,data2; |
|
| 1033 |
.................... #endif |
|
| 1034 |
.................... signed int8 n; |
|
| 1035 |
.................... #ifdef _ERRNO |
|
| 1036 |
.................... if(x <0) |
|
| 1037 |
.................... {
|
|
| 1038 |
.................... errno=EDOM; |
|
| 1039 |
.................... } |
|
| 1040 |
.................... if(x ==0) |
|
| 1041 |
.................... {
|
|
| 1042 |
.................... errno=ERANGE; |
|
| 1043 |
.................... return(0); |
|
| 1044 |
.................... } |
|
| 1045 |
.................... #endif |
|
| 1046 |
.................... y = x; |
|
| 1047 |
.................... |
|
| 1048 |
.................... if (y != 1.0) |
|
| 1049 |
.................... {
|
|
| 1050 |
.................... #if !defined(__PCD__) |
|
| 1051 |
.................... *((unsigned int8 *)(&y)) = 0x7E; |
|
| 1052 |
.................... #endif |
|
| 1053 |
.................... |
|
| 1054 |
.................... #if defined(__PCD__) // Takes care of IEEE format |
|
| 1055 |
.................... data2 = *(((unsigned int8 *)(&y))+3); |
|
| 1056 |
.................... *(((unsigned int8 *)(&y))+3) = 0x3F; |
|
| 1057 |
.................... data1 = *(((unsigned int8 *)(&y))+2); |
|
| 1058 |
.................... bit_clear(data1,7); |
|
| 1059 |
.................... *(((unsigned int8 *)(&y))+2) = data1; |
|
| 1060 |
.................... if(bit_test(data2,7)) |
|
| 1061 |
.................... bit_set(*(((unsigned int8 *)(&y))+3),7); |
|
| 1062 |
.................... #endif |
|
| 1063 |
.................... |
|
| 1064 |
.................... y = (y - 1.0)/(y + 1.0); |
|
| 1065 |
.................... |
|
| 1066 |
.................... y2=y*y; |
|
| 1067 |
.................... |
|
| 1068 |
.................... res = pl[0]*y2 + pl[1]; |
|
| 1069 |
.................... res = res*y2 + pl[2]; |
|
| 1070 |
.................... res = res*y2 + pl[3]; |
|
| 1071 |
.................... |
|
| 1072 |
.................... r = ql[0]*y2 + ql[1]; |
|
| 1073 |
.................... r = r*y2 + ql[2]; |
|
| 1074 |
.................... r = r*y2 + ql[3]; |
|
| 1075 |
.................... |
|
| 1076 |
.................... res = y*res/r; |
|
| 1077 |
.................... #if !defined(__PCD__) |
|
| 1078 |
.................... n = *((unsigned int8 *)(&x)) - 0x7E; |
|
| 1079 |
.................... #endif |
|
| 1080 |
.................... #if defined(__PCD__) |
|
| 1081 |
.................... data1 = *(((unsigned int8 *)(&x)+3)); |
|
| 1082 |
.................... rotate_left(&data1,1); |
|
| 1083 |
.................... data2 = *(((unsigned int8 *)(&x)+2)); |
|
| 1084 |
.................... if(bit_test (data2,7)) |
|
| 1085 |
.................... bit_set(data1,0); |
|
| 1086 |
.................... n = data1 - 0x7E; |
|
| 1087 |
.................... #endif |
|
| 1088 |
.................... |
|
| 1089 |
.................... if (n<0) |
|
| 1090 |
.................... r = -(float32)-n; |
|
| 1091 |
.................... else |
|
| 1092 |
.................... r = (float32)n; |
|
| 1093 |
.................... |
|
| 1094 |
.................... res += r*LN2; |
|
| 1095 |
.................... } |
|
| 1096 |
.................... |
|
| 1097 |
.................... else |
|
| 1098 |
.................... res = 0.0; |
|
| 1099 |
.................... |
|
| 1100 |
.................... return(res); |
|
| 1101 |
.................... } |
|
| 1102 |
.................... |
|
| 1103 |
.................... //Overloaded function for log() for PCD |
|
| 1104 |
.................... // Overloaded function log() for data type - Float48 |
|
| 1105 |
.................... #if defined(__PCD__) |
|
| 1106 |
.................... float48 log(float48 x) |
|
| 1107 |
.................... {
|
|
| 1108 |
.................... float48 y, res, r, y2; |
|
| 1109 |
.................... unsigned int8 data1,data2; |
|
| 1110 |
.................... signed int8 n; |
|
| 1111 |
.................... #ifdef _ERRNO |
|
| 1112 |
.................... if(x <0) |
|
| 1113 |
.................... {
|
|
| 1114 |
.................... errno=EDOM; |
|
| 1115 |
.................... } |
|
| 1116 |
.................... if(x ==0) |
|
| 1117 |
.................... {
|
|
| 1118 |
.................... errno=ERANGE; |
|
| 1119 |
.................... return(0); |
|
| 1120 |
.................... } |
|
| 1121 |
.................... #endif |
|
| 1122 |
.................... y = x; |
|
| 1123 |
.................... |
|
| 1124 |
.................... if (y != 1.0) |
|
| 1125 |
.................... {
|
|
| 1126 |
.................... |
|
| 1127 |
.................... #if !defined(__PCD__) |
|
| 1128 |
.................... *((unsigned int8 *)(&y)) = 0x7E; |
|
| 1129 |
.................... #endif |
|
| 1130 |
.................... data2 = *(((unsigned int8 *)(&y))+5); |
|
| 1131 |
.................... *(((unsigned int8 *)(&y))+5) = 0x3F; |
|
| 1132 |
.................... data1 = *(((unsigned int8 *)(&y))+4); |
|
| 1133 |
.................... bit_clear(data1,7); |
|
| 1134 |
.................... *(((unsigned int8 *)(&y))+4) = data1; |
|
| 1135 |
.................... |
|
| 1136 |
.................... if(bit_test(data2,7)) |
|
| 1137 |
.................... bit_set(*(((unsigned int8 *)(&y))+4),7); |
|
| 1138 |
.................... y = (y - 1.0)/(y + 1.0); |
|
| 1139 |
.................... |
|
| 1140 |
.................... y2=y*y; |
|
| 1141 |
.................... |
|
| 1142 |
.................... res = pl[0]*y2 + pl[1]; |
|
| 1143 |
.................... res = res*y2 + pl[2]; |
|
| 1144 |
.................... res = res*y2 + pl[3]; |
|
| 1145 |
.................... |
|
| 1146 |
.................... r = ql[0]*y2 + ql[1]; |
|
| 1147 |
.................... r = r*y2 + ql[2]; |
|
| 1148 |
.................... r = r*y2 + ql[3]; |
|
| 1149 |
.................... |
|
| 1150 |
.................... res = y*res/r; |
|
| 1151 |
.................... |
|
| 1152 |
.................... data1 = *(((unsigned int8 *)(&x)+5)); |
|
| 1153 |
.................... rotate_left(&data1,1); |
|
| 1154 |
.................... data2 = *(((unsigned int8 *)(&x)+4)); |
|
| 1155 |
.................... if(bit_test (data2,7)) |
|
| 1156 |
.................... bit_set(data1,0); |
|
| 1157 |
.................... |
|
| 1158 |
.................... n = data1 - 0x7E; |
|
| 1159 |
.................... |
|
| 1160 |
.................... if (n<0) |
|
| 1161 |
.................... r = -(float48)-n; |
|
| 1162 |
.................... else |
|
| 1163 |
.................... r = (float48)n; |
|
| 1164 |
.................... |
|
| 1165 |
.................... res += r*LN2; |
|
| 1166 |
.................... } |
|
| 1167 |
.................... |
|
| 1168 |
.................... else |
|
| 1169 |
.................... res = 0.0; |
|
| 1170 |
.................... |
|
| 1171 |
.................... return(res); |
|
| 1172 |
.................... } |
|
| 1173 |
.................... |
|
| 1174 |
.................... // Overloaded function log() for data type - Float48 |
|
| 1175 |
.................... #if defined(__PCD__) |
|
| 1176 |
.................... float32 const pl_64[4] = {0.45145214, -9.0558803, 26.940971, -19.860189};
|
|
| 1177 |
.................... float32 const ql_64[4] = {1.0000000, -8.1354259, 16.780517, -9.9300943};
|
|
| 1178 |
.................... #endif |
|
| 1179 |
.................... float64 log(float64 x) |
|
| 1180 |
.................... {
|
|
| 1181 |
.................... float64 y, res, r, y2; |
|
| 1182 |
.................... unsigned int16 data1,data2; |
|
| 1183 |
.................... unsigned int16 *p; |
|
| 1184 |
.................... signed int16 n; |
|
| 1185 |
.................... #ifdef _ERRNO |
|
| 1186 |
.................... if(x <0) |
|
| 1187 |
.................... {
|
|
| 1188 |
.................... errno=EDOM; |
|
| 1189 |
.................... } |
|
| 1190 |
.................... if(x ==0) |
|
| 1191 |
.................... {
|
|
| 1192 |
.................... errno=ERANGE; |
|
| 1193 |
.................... return(0); |
|
| 1194 |
.................... } |
|
| 1195 |
.................... #endif |
|
| 1196 |
.................... y = x; |
|
| 1197 |
.................... |
|
| 1198 |
.................... if (y != 1.0) |
|
| 1199 |
.................... {
|
|
| 1200 |
.................... #if !defined(__PCD__) |
|
| 1201 |
.................... *((unsigned int8 *)(&y)) = 0x7E; |
|
| 1202 |
.................... #endif |
|
| 1203 |
.................... p= (((unsigned int16 *)(&y))+3); |
|
| 1204 |
.................... data1 = *p; |
|
| 1205 |
.................... data2 = *p; |
|
| 1206 |
.................... data1 = 0x3FE; |
|
| 1207 |
.................... data1 = data1 <<4; |
|
| 1208 |
.................... if(bit_test (data2,15)) |
|
| 1209 |
.................... bit_set(data1,15); |
|
| 1210 |
.................... data2 = data2 & 0x000F; |
|
| 1211 |
.................... data1 ^=data2; |
|
| 1212 |
.................... |
|
| 1213 |
.................... *p = data1; |
|
| 1214 |
.................... |
|
| 1215 |
.................... y = (y - 1.0)/(y + 1.0); |
|
| 1216 |
.................... |
|
| 1217 |
.................... y2=y*y; |
|
| 1218 |
.................... |
|
| 1219 |
.................... res = pl_64[0]*y2 + pl_64[1]; |
|
| 1220 |
.................... res = res*y2 + pl_64[2]; |
|
| 1221 |
.................... res = res*y2 + pl_64[3]; |
|
| 1222 |
.................... |
|
| 1223 |
.................... r = ql_64[0]*y2 + ql_64[1]; |
|
| 1224 |
.................... r = r*y2 + ql_64[2]; |
|
| 1225 |
.................... r = r*y2 + ql_64[3]; |
|
| 1226 |
.................... |
|
| 1227 |
.................... res = y*res/r; |
|
| 1228 |
.................... |
|
| 1229 |
.................... p= (((unsigned int16 *)(&x))+3); |
|
| 1230 |
.................... data1 = *p; |
|
| 1231 |
.................... bit_clear(data1,15); |
|
| 1232 |
.................... data1 = data1 >>4; |
|
| 1233 |
.................... n = data1 - 0x3FE; |
|
| 1234 |
.................... |
|
| 1235 |
.................... |
|
| 1236 |
.................... if (n<0) |
|
| 1237 |
.................... r = -(float64)-n; |
|
| 1238 |
.................... else |
|
| 1239 |
.................... r = (float64)n; |
|
| 1240 |
.................... |
|
| 1241 |
.................... res += r*LN2; |
|
| 1242 |
.................... } |
|
| 1243 |
.................... |
|
| 1244 |
.................... else |
|
| 1245 |
.................... res = 0.0; |
|
| 1246 |
.................... |
|
| 1247 |
.................... return(res); |
|
| 1248 |
.................... } |
|
| 1249 |
.................... #endif |
|
| 1250 |
.................... |
|
| 1251 |
.................... |
|
| 1252 |
.................... #define LN10 2.3025850929940456 |
|
| 1253 |
.................... |
|
| 1254 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1255 |
.................... // float log10(float x) |
|
| 1256 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1257 |
.................... // Description : returns the the log base 10 of x |
|
| 1258 |
.................... // Date : N/A |
|
| 1259 |
.................... // |
|
| 1260 |
.................... float32 log10(float32 x) |
|
| 1261 |
.................... {
|
|
| 1262 |
.................... float32 r; |
|
| 1263 |
.................... |
|
| 1264 |
.................... r = log(x); |
|
| 1265 |
.................... r = r/LN10; |
|
| 1266 |
.................... return(r); |
|
| 1267 |
.................... } |
|
| 1268 |
.................... |
|
| 1269 |
.................... //Overloaded functions for log10() for PCD |
|
| 1270 |
.................... // Overloaded function log10() for data type - Float48 |
|
| 1271 |
.................... #if defined(__PCD__) |
|
| 1272 |
.................... float48 log10(float48 x) |
|
| 1273 |
.................... {
|
|
| 1274 |
.................... float48 r; |
|
| 1275 |
.................... |
|
| 1276 |
.................... r = log(x); |
|
| 1277 |
.................... r = r/LN10; |
|
| 1278 |
.................... return(r); |
|
| 1279 |
.................... } |
|
| 1280 |
.................... |
|
| 1281 |
.................... // Overloaded function log10() for data type - Float64 |
|
| 1282 |
.................... float64 log10(float64 x) |
|
| 1283 |
.................... {
|
|
| 1284 |
.................... float64 r; |
|
| 1285 |
.................... |
|
| 1286 |
.................... r = log(x); |
|
| 1287 |
.................... r = r/LN10; |
|
| 1288 |
.................... return(r); |
|
| 1289 |
.................... } |
|
| 1290 |
.................... #endif |
|
| 1291 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1292 |
.................... // float modf(float x) |
|
| 1293 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1294 |
.................... // Description :breaks the argument value int integral and fractional parts, |
|
| 1295 |
.................... // ach of which have the same sign as the argument. It stores the integral part |
|
| 1296 |
.................... // as a float in the object pointed to by the iptr |
|
| 1297 |
.................... // Returns : returns the signed fractional part of value. |
|
| 1298 |
.................... // Date : N/A |
|
| 1299 |
.................... // |
|
| 1300 |
.................... |
|
| 1301 |
.................... float32 modf(float32 value,float32 *iptr) |
|
| 1302 |
.................... {
|
|
| 1303 |
.................... *iptr=(value < 0.0)? ceil(value): floor(value); |
|
| 1304 |
.................... return(value - *iptr); |
|
| 1305 |
.................... } |
|
| 1306 |
.................... //Overloaded functions for modf() for PCD |
|
| 1307 |
.................... // Overloaded function modf() for data type - Float48 |
|
| 1308 |
.................... #if defined(__PCD__) |
|
| 1309 |
.................... float48 modf(float48 value,float48 *iptr) |
|
| 1310 |
.................... {
|
|
| 1311 |
.................... *iptr=(value < 0.0)? ceil(value): floor(value); |
|
| 1312 |
.................... return(value - *iptr); |
|
| 1313 |
.................... } |
|
| 1314 |
.................... // Overloaded function modf() for data type - Float64 |
|
| 1315 |
.................... float64 modf(float64 value,float64 *iptr) |
|
| 1316 |
.................... {
|
|
| 1317 |
.................... *iptr=(value < 0.0)? ceil(value): floor(value); |
|
| 1318 |
.................... return(value - *iptr); |
|
| 1319 |
.................... } |
|
| 1320 |
.................... #endif |
|
| 1321 |
.................... |
|
| 1322 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1323 |
.................... // float pwr(float x,float y) |
|
| 1324 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1325 |
.................... // Description : returns the value (x^y) |
|
| 1326 |
.................... // Date : N/A |
|
| 1327 |
.................... // Note : 0 is returned when the function will generate an imaginary number |
|
| 1328 |
.................... // |
|
| 1329 |
.................... float32 pwr(float32 x,float32 y) |
|
| 1330 |
.................... {
|
|
| 1331 |
.................... if(0 > x && fmod(y, 1) == 0) {
|
|
| 1332 |
.................... if(fmod(y, 2) == 0) {
|
|
| 1333 |
.................... return (exp(log(-x) * y)); |
|
| 1334 |
.................... } else {
|
|
| 1335 |
.................... return (-exp(log(-x) * y)); |
|
| 1336 |
.................... } |
|
| 1337 |
.................... } else if(0 > x && fmod(y, 1) != 0) {
|
|
| 1338 |
.................... return 0; |
|
| 1339 |
.................... } else {
|
|
| 1340 |
.................... if(x != 0 || 0 >= y) {
|
|
| 1341 |
.................... return (exp(log(x) * y)); |
|
| 1342 |
.................... } |
|
| 1343 |
.................... } |
|
| 1344 |
.................... } |
|
| 1345 |
.................... //Overloaded functions for pwr() for PCD |
|
| 1346 |
.................... // Overloaded function pwr() for data type - Float48 |
|
| 1347 |
.................... #if defined(__PCD__) |
|
| 1348 |
.................... float48 pwr(float48 x,float48 y) |
|
| 1349 |
.................... {
|
|
| 1350 |
.................... if(0 > x && fmod(y, 1) == 0) {
|
|
| 1351 |
.................... if(fmod(y, 2) == 0) {
|
|
| 1352 |
.................... return (exp(log(-x) * y)); |
|
| 1353 |
.................... } else {
|
|
| 1354 |
.................... return (-exp(log(-x) * y)); |
|
| 1355 |
.................... } |
|
| 1356 |
.................... } else if(0 > x && fmod(y, 1) != 0) {
|
|
| 1357 |
.................... return 0; |
|
| 1358 |
.................... } else {
|
|
| 1359 |
.................... if(x != 0 || 0 >= y) {
|
|
| 1360 |
.................... return (exp(log(x) * y)); |
|
| 1361 |
.................... } |
|
| 1362 |
.................... } |
|
| 1363 |
.................... } |
|
| 1364 |
.................... // Overloaded function pwr() for data type - Float64 |
|
| 1365 |
.................... float64 pwr(float64 x,float64 y) |
|
| 1366 |
.................... {
|
|
| 1367 |
.................... if(0 > x && fmod(y, 1) == 0) {
|
|
| 1368 |
.................... if(fmod(y, 2) == 0) {
|
|
| 1369 |
.................... return (exp(log(-x) * y)); |
|
| 1370 |
.................... } else {
|
|
| 1371 |
.................... return (-exp(log(-x) * y)); |
|
| 1372 |
.................... } |
|
| 1373 |
.................... } else if(0 > x && fmod(y, 1) != 0) {
|
|
| 1374 |
.................... return 0; |
|
| 1375 |
.................... } else {
|
|
| 1376 |
.................... if(x != 0 || 0 >= y) {
|
|
| 1377 |
.................... return (exp(log(x) * y)); |
|
| 1378 |
.................... } |
|
| 1379 |
.................... } |
|
| 1380 |
.................... } |
|
| 1381 |
.................... #endif |
|
| 1382 |
.................... |
|
| 1383 |
.................... //////////////////// Power functions //////////////////// |
|
| 1384 |
.................... |
|
| 1385 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1386 |
.................... // float pow(float x,float y) |
|
| 1387 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1388 |
.................... // Description : returns the value (x^y) |
|
| 1389 |
.................... // Date : N/A |
|
| 1390 |
.................... // Note : 0 is returned when the function will generate an imaginary number |
|
| 1391 |
.................... // |
|
| 1392 |
.................... float32 pow(float32 x,float32 y) |
|
| 1393 |
.................... {
|
|
| 1394 |
.................... if(0 > x && fmod(y, 1) == 0) {
|
|
| 1395 |
.................... if(fmod(y, 2) == 0) {
|
|
| 1396 |
.................... return (exp(log(-x) * y)); |
|
| 1397 |
.................... } else {
|
|
| 1398 |
.................... return (-exp(log(-x) * y)); |
|
| 1399 |
.................... } |
|
| 1400 |
.................... } else if(0 > x && fmod(y, 1) != 0) {
|
|
| 1401 |
.................... return 0; |
|
| 1402 |
.................... } else {
|
|
| 1403 |
.................... if(x != 0 || 0 >= y) {
|
|
| 1404 |
.................... return (exp(log(x) * y)); |
|
| 1405 |
.................... } |
|
| 1406 |
.................... } |
|
| 1407 |
.................... } |
|
| 1408 |
.................... //Overloaded functions for pow() for PCD |
|
| 1409 |
.................... // Overloaded function for pow() data type - Float48 |
|
| 1410 |
.................... #if defined(__PCD__) |
|
| 1411 |
.................... float48 pow(float48 x,float48 y) |
|
| 1412 |
.................... {
|
|
| 1413 |
.................... if(0 > x && fmod(y, 1) == 0) {
|
|
| 1414 |
.................... if(fmod(y, 2) == 0) {
|
|
| 1415 |
.................... return (exp(log(-x) * y)); |
|
| 1416 |
.................... } else {
|
|
| 1417 |
.................... return (-exp(log(-x) * y)); |
|
| 1418 |
.................... } |
|
| 1419 |
.................... } else if(0 > x && fmod(y, 1) != 0) {
|
|
| 1420 |
.................... return 0; |
|
| 1421 |
.................... } else {
|
|
| 1422 |
.................... if(x != 0 || 0 >= y) {
|
|
| 1423 |
.................... return (exp(log(x) * y)); |
|
| 1424 |
.................... } |
|
| 1425 |
.................... } |
|
| 1426 |
.................... } |
|
| 1427 |
.................... |
|
| 1428 |
.................... // Overloaded function pow() for data type - Float64 |
|
| 1429 |
.................... float64 pow(float64 x,float64 y) |
|
| 1430 |
.................... {
|
|
| 1431 |
.................... if(0 > x && fmod(y, 1) == 0) {
|
|
| 1432 |
.................... if(fmod(y, 2) == 0) {
|
|
| 1433 |
.................... return (exp(log(-x) * y)); |
|
| 1434 |
.................... } else {
|
|
| 1435 |
.................... return (-exp(log(-x) * y)); |
|
| 1436 |
.................... } |
|
| 1437 |
.................... } else if(0 > x && fmod(y, 1) != 0) {
|
|
| 1438 |
.................... return 0; |
|
| 1439 |
.................... } else {
|
|
| 1440 |
.................... if(x != 0 || 0 >= y) {
|
|
| 1441 |
.................... return (exp(log(x) * y)); |
|
| 1442 |
.................... } |
|
| 1443 |
.................... } |
|
| 1444 |
.................... } |
|
| 1445 |
.................... #endif |
|
| 1446 |
.................... |
|
| 1447 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1448 |
.................... // float sqrt(float x) |
|
| 1449 |
.................... //////////////////////////////////////////////////////////////////////////// |
|
| 1450 |
.................... // Description : returns the square root of x |
|
| 1451 |
.................... // Date : N/A |
|
| 1452 |
.................... // |
|
| 1453 |
.................... float32 sqrt(float32 x) |
|
| 1454 |
.................... {
|
|
| 1455 |
.................... float32 y, res; |
|
| 1456 |
.................... #if defined(__PCD__) |
|
| 1457 |
.................... unsigned int16 data1,data2; |
|
| 1458 |
.................... #endif |
|
| 1459 |
.................... BYTE *p; |
|
| 1460 |
.................... |
|
| 1461 |
.................... #ifdef _ERRNO |
|
| 1462 |
.................... if(x < 0) |
|