09. september 2010 - 09:00
Der er
10 kommentarer og
1 løsning
en C-compiler uden floating point???
Hey jeg påtænker mig at benytte denne C-compiler til at programmerere på en Propeller microcontroller, men den har bl.a. ikke floating point understøttelse.
Er der nogen der kan fortælle mig hvad det vil kunne komme til at betyde for mig?? Samt om der er andre ting ved denne compiler jeg skal være opmærksom på???
Det jeg skal laver er et display med touch hvor man kan ændre variabler ved at trække fingeren henover displayet, som så vil få indvirkning på et output fra en DAC...
c - compiler
http://www.imagecraft.com/devtools_Propeller.htmlMicrocontroller:
http://www.parallax.com/tabid/407/Default.aspx
09. september 2010 - 14:08
#1
Hvis compileren ikke understøtter FP (formentligt fordi processoren ikke understøtter FP og man ikke har fundet det umagen værd med et langsomt emulerings bibliotek), så kan du ikke bruge FP!
:-)
Er det et problem at du ikke kan bruge float og double?
09. september 2010 - 20:15
#2
Problemet er at jeg ikke er erfaren nok til at afgøre om det er noget der kommer til at have nogen betydning for vores projekt!
Og jo, processoren understøtter FP, men det gør C-compileren ikke endnu! der er heller ikke endnu en debugger, så jeg prøver at finde ud af hvad vi har med at gøre da det er en processor som det firma vi skal lave projekt for vil have at vi bruger...
10. september 2010 - 11:28
#6
Så det er ikke sådan at jeg får fejlberegninger ved at bruge en int som indeholder et kommatal??
implied decimal, er det hvor man forudbestemmer at alle tal har eksempelvis 4 decimaler, som så er nul hvis ikke det er et decimaltal alligevel?
11. september 2010 - 03:59
#8
Til inspiration:
#include <stdio.h>
typedef struct
{
int val;
int impldeci;
} FIXP;
#define MAX(i,j) ((i>=j)?(i):(j))
static int POW10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };
FIXP init(int val, int impldeci)
{
FIXP res;
res.val = val;
res.impldeci = impldeci;
return res;
}
FIXP add(FIXP v1, FIXP v2)
{
FIXP res;
int d;
d = MAX(v1.impldeci, v2.impldeci);
res.val = v1.val * POW10[MAX(d - v1.impldeci,0)] + v2.val * POW10[MAX(d - v2.impldeci,0)];
res.impldeci = d;
return res;
}
FIXP mul(FIXP v1, FIXP v2)
{
FIXP res;
res.val = v1.val * v2.val;
res.impldeci = v1.impldeci + v2.impldeci;
return res;
}
FIXP div(FIXP v1, FIXP v2)
{
FIXP res;
int d;
d = MAX(v1.impldeci, v2.impldeci);
res.val = v1.val * POW10[MAX(d - v1.impldeci,0)] / v2.val;
res.impldeci = d - v2.impldeci;
return res;
}
void print(FIXP v)
{
printf("%d.%0*d\n", v.val / POW10[v.impldeci], v.impldeci, v.val % POW10[v.impldeci]);
}
int main()
{
double a, b, c, d, x;
FIXP a2, b2, c2, d2, x2;
a = 1.58;
b = 0.3;
c = 0.5;
d = 2;
x = (a + b) * c / d;
printf("%f\n", x);
a2 = init(158, 2);
b2 = init(3, 1);
c2 = init(5, 1);
d2 = init(2, 0);
x2 = div(mul(add(a2, b2), c2), d2);
print(x2);
return 0;
}