Habe bei der Gleitkommaberechnung beim ATMEGA128 Probleme...
Habe eine Routine um vom HSV Farbraum in den RGB Farbraum umzurechnen.
Leider sind die Ergebnisse teilweise sehr ungenau.
1 | #typedef u8 unsigned char
|
2 | u8 R, G, B;
|
3 | u8 hi = (u8) ((float)hue / 60.0F);
|
4 | float f = (((float)hue) / 60.0F) - hi;
|
5 | float V = (((float)value)/100.0F);
|
6 | float S = (((float)sat)/100.0F);
|
7 | float p=V*(1.0F-S);
|
8 | float q=V*(1.0F-(S*f));
|
9 | float t = V*(1.0F-S*(1.0F-f));
|
10 |
|
11 | switch(hi)
|
12 | {
|
13 | case 0:
|
14 | case 6:
|
15 | R = (u8) (V*255.0f);
|
16 | G = (u8) (t*255.0f);
|
17 | B = (u8) (p*255.0f);
|
18 |
|
19 | break;
|
20 | case 1:
|
21 | R = (u8) (q*255.0f);
|
22 | G = (u8) (V*255.0f);
|
23 | B = (u8) (p*255.0f);
|
24 | break;
|
25 | case 2:
|
26 | R = (u8) (p*255.0f);
|
27 | G = (u8) (V*255.0f);
|
28 | B = (u8) (t*255.0f);
|
29 | break;
|
30 | case 3:
|
31 | R = (u8) (p*255.0f);
|
32 | G = (u8) (q*255.0f);
|
33 | B = (u8) (V*255.0f);
|
34 | break;
|
35 | case 4:
|
36 | R = (u8) (t*255.0f);
|
37 | G = (u8) (p*255.0f);
|
38 | B = (u8) (V*255.0f);
|
39 | break;
|
40 | case 5:
|
41 | R = (u8) (V*255.0f);
|
42 | G = (u8) (p*255.0f);
|
43 | B = (u8) (q*255.0f);
|
44 | break;
|
45 | }
|
Wie gut kommt der AVR mit der Gleitkommaberechnung zusammen?
Sollte ich vielleicht das ganze mit double anstatt von float probieren?
Kann man diese Berechnung vielleicht irgendwie vereinfachen?
Probleme gibt es eigentlich bei allen Berechnung bezüglich der
Genauigkeit
Hier bei dieser Berechnung kommt z.B. wenn sat=100 gesetzt ist nicht
1.00 als Ergebnis heraus sondern teilweise 1.14 oder sonst irgendwas
aber meißtens nicht genau 1
1 | float S = (((float)sat)/100.0F);
|