Probleme mit Fix64

  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 2 of 5
Avra
Schreiberling
Avatar
Gender:
Location: Belgrade, Serbia
Age: 53
Homepage: rs.linkedin.com/in…
Posts: 653
Registered: 07 / 2002
Subject:

Re: Probleme mit Fix64

 · 
Posted: 07.10.2010 - 14:50  ·  #9
Yes, their so called double is a fake, since it is just 32 bits. It is actually a single floating type and the same code is produced whether you use single or double type. However, there exists one independent implementation of real double type for AVR GCC, but it is barely known and it is not part of some standard library.
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Probleme mit Fix64

 · 
Posted: 11.12.2010 - 14:46  ·  #10
Hallo,

habe folgendes Problem:

Wenn ich in meinem Programm Fix64 importiere mit From System Import Fix64;
gibt folgende Zeile einen Compiler Error : Float expected

eeADCParam[$0010] : Array [0..3] Of Float = (-194.34, 5.4752, -0.0003, 0.0000002);

Auch das Statement... IntToStr(Trunc(-7.7))) ... liefert plötzlich den Fehler Word or Integer expected.

Bisher lief das ganz gut.

die 2. Sache ist folgendes: ich muß im Programm an einer einzigen Stelle eine Fix64 Variable einer Float Variablen zuordnen. Das geht dann so:

iFLoat := Fix64ToFloat(iFix64);

Dafür muß ich aber die uFix64.PCU in den USES hinzufügen und - zack - ist das compilierte Programm von 216 KB auf 240 KB angewachsen - für diese eine Zeile. Mit dem Merlin Optimizer bekommt man das ja wieder repariert, aber dann ist die Compile-Zeit nicht mehr vergleichbar. Ich habe eure Fußnote im Manual zur Fic64 und Merlin Optimizer auch gesehen - aber der normale Compile dauert bei mir 15 Sek., der mit dem Merlin 153 Sek. Früher hat der AVRco selbst unbenutzte Funktionen und Prozeduren rausgeworfen, ich glaube, das hat Rolf mal umgestellt.

Was tun? Könnten die Type-Casts nicht wenigstens im normalen Compiler laufen? Sonst wird die Programmierung ja zur Qual!

Grüße, Michael
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Probleme mit Fix64

 · 
Posted: 11.12.2010 - 15:39  ·  #11
Hallo Michael,

hast Du mal folgendes probiert:

v3.0.5.0 New directive {$OPTI SMARTLINK_ONLY} added that behaves similarly to the original linker option SMARTLINK.
WARNING - this optimisation is normally performed anyway. The effect of this directive is to DISABLE all other
optimisations!


Gruß
Gunter
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Probleme mit Fix64

 · 
Posted: 11.12.2010 - 16:18  ·  #12
Hallo Gunter,

danke für den schnellen Tip. Dann sind es mit dem Optimizer noch 40 Sek (mit eiem Warning wegen OptiLink). Schon Besser, aber schöner wäre der Fix64ToFloat im System. Der umgekehrte Typecast Fix64(Float) ist ja auch dort drin und braucht die uFix64.PCU nicht.

Und dann sind da auch noch die anderen Fragen zu Fix64 - aber dazu meldet sich ggf. Rolf?

Schönes Wochenende noch, Michael!

EDIT: der TypeCast Fix64(Float), der im Compiler drin ist, liefert FALSCHE Fix64-Werte zurück!! Hier muss AUCH die Funktion FloatToFix64(Float) aus der uFix64.PCU genommen werden!
Beispiel: Ein Fix64ToFloat(Fix64(iFloat)) ergibt bei iFloat := 0.00016 als Ergebnis 0.22326.
Richtig muß es heißen Fix64ToFloat(FloatToFix64(iFloat))..
Das ist ein Beispiel, nicht daß einer fragt, warum ich ein Float zu Fix64 und dann wieder zu Float mache...
Außerdem muß man ganz schön aufpassen, die Unit braucht mehr Frame-Speicher - klar..
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Probleme mit Fix64

 · 
Posted: 12.12.2010 - 20:16  ·  #13
Hallo Michael,

ein Typecast wandelt normalerweise physisch nichts um. Er erklärt einen Speicher Inhalt zu einem anderen Typ!
Eine Werte Umwandlung kann nur durch FloatToFix64(Float) oder Fix64ToFloat(Fix64) erfolgen. Deshalb kann auch Fix64ToFloat(Fix64(iFloat)) nicht funktionieren!

btw.
Wenn Float und Fix64 gkeichzeitig importiert sind kann das hier nicht funktionieren: IntToStr(Trunc(-7.7)
Woher soll der Compiler wissen was -7.7 für ein Typ ist?? Float oder Fix64...
Das sollte tun und kostet kein Byte Code mehr: IntToStr(Trunc(Fix64(-7.7))

Gerade bei immidiate Konstanten kann der Compiler hier nicht immer wissen was Sache ist.

Da die Fix64-Float Funktionen in Pascal geschrieben sind, müssen diese auch in einer Unit untergebracht sein. Hier die zwei Sources:
Code
type
  TFix64Overlay = record // this is handy for fast extraction of integer and fractional parts
                    fix        : fix64;
                    x  [@fix]  : fix64;
                    i64[@fix]  : int64;
                    w64[@fix]  : word64;
                    i  [@fix+4]: longint;
                    i32[@fix+4]: longint;
                    f  [@fix]  : longword;
                    f32[@fix]  : longword;
                    b  [@fix]  : array[0..7] of byte;
                    w  [@fix]  : array[0..3] of word;
                  end;

function FloatToFix64(const a: float): fix64;
var
  Tmp: TFix64Overlay;
begin  
  Tmp.i := Trunc(a);
  if (a < 0) and (Frac(a) <> 0) then
    Dec(Tmp.i); 
  endif;
  Tmp.f := Trunc(Frac(a) * (float($FFFFFFFF) + 1)); 
  return(Tmp.fix);
end;

function Fix64ToFloat(const a: fix64): float;
var
  Tmp[@a]: TFix64Overlay;
begin  
  return(float(Tmp.i) + float(Tmp.f) / (float($FFFFFFFF) + float(1))); 
end;


rolf
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Probleme mit Fix64

 · 
Posted: 12.12.2010 - 21:30  ·  #14
Hallo Rolf,

you make my day! Herzlichen Dank für die beiden Sourcen, ich werde sie morgen früh probieren. Das kürzt meine Entwicklungszeit sehr ab, wenn es klappt.
Danke auch für die Erläuterungen zu den TypeCasts, das ist logisch. Als Nicht-Compiler-Entwickler hat man so etwas nur nicht immer so vor Augen und man erkämpft sich mit Lesen, Probieren und Testen das Compiler-Anwendungs-KnowHow. Das Forum und eure schnellen Antworten sind dann eine klasse Hilfe, wenn man nicht mehr richtig weiter kommt.

Thanx, Michael
Avra
Schreiberling
Avatar
Gender:
Location: Belgrade, Serbia
Age: 53
Homepage: rs.linkedin.com/in…
Posts: 653
Registered: 07 / 2002
Subject:

Re: Probleme mit Fix64

 · 
Posted: 16.12.2010 - 14:10  ·  #15
Quote by mc-electronic
Wenn ich in meinem Programm Fix64 importiere mit From System Import Fix64;
gibt folgende Zeile einen Compiler Error : Float expected
eeADCParam[$0010] : Array [0..3] Of Float = (-194.34, 5.4752, -0.0003, 0.0000002);
Quote by mc-electronic
Auch das Statement... IntToStr(Trunc(-7.7))) ... liefert plötzlich den Fehler Word or Integer expected.

@Rolf: Maybe you should revisit compiler error messages. Something like "Float expected but Fix64 was given" and "Word or Integer expected but LongInteger was given" could be more helpful for AvrCo users.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Probleme mit Fix64

 · 
Posted: 16.12.2010 - 14:20  ·  #16
Hello Avra,

I think I have fixed these issues now.

rolf
  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 2 of 5
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   129   143 · Page-Gen-Time: 0.027588s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI