![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
n-squared
Joined: 03 Oct 2006 Posts: 99
|
float operation not working on 16 bit parts |
Posted: Mon Jun 03, 2013 1:06 am |
|
|
Hi
I am trying to do simple float arithmetic on PIC24 parts.
Nothing seems to work right.
I am using PCD V4.140 (tried also V4.137).
MCU is PIC24FJ128GA106 (I also tried other parts).
MPLAB V8.86 and PCWHD 4.140 show the same garbage for data.
Attached is a sample code.
Code: |
#include <24FJ128GA106.h>
#device adc=8
#device ICD=2
#device pass_strings=in_ram
#FUSES WDT
#FUSES WPOSTS16 //Watch Dog Timer PostScalar 1:8192
#FUSES ICSP2 //ICD uses PGC2/PGD2 pins
#FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled
#FUSES FRC_PLL
#FUSES OSCIO
#define SYSTEM_SPEED 32000000
//#use delay(clock=SYSTEM_SPEED,restart_wdt)
#use delay(internal=8MHZ, clock=SYSTEM_SPEED)
#include <stdlib.h>
void main() {
long int l;
float a, b;
int8 buf[80];
a = 1.0;
b = 2.1;
while(TRUE) {
sprintf(buf,"\r\n\nA= %E\r\n", a);
sprintf(buf,"B= %E\r\n", b);
sprintf(buf,"\r\na + b = %E", a + b);
sprintf(buf,"\r\na - b = %E", a - b);
sprintf(buf,"\r\na * b = %E", a * b);
sprintf(buf,"\r\na / b = %E\r\n", a / b);
a += 0.1;
b -= 0.1;
}
}
|
Anybody has an idea?
Thanks
Noam _________________ Every solution has a problem. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Mon Jun 03, 2013 1:30 am |
|
|
Obvious comment, with the watchdog timer enabled, and not reset anywhere, it is going to restart at some point and give garbage....
Even with the 'restart' in delays, you'd get the same, since you don't use any delays.
However generally, you may just be getting exactly what you'd expect from floats. Load the Pconvert tool. type in 2.1, into the IEEEfloat32 window. The note the hex bytes, and type these back into the hex window. What gets displayed in the IEEE window?. 2.1, can't exactly be represented by a standard float. 2.0999999 is the closest the format can give. This is why when you output such numbers you'd normally round. This is also why if you want to do accurate arithmetic for money etc., you should always use scaled integers rather than floats.....
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|