www.mikrocontroller.net

Forum: Codesammlung Festkommazahlen mit C++


Autor: Klaus Wachtler (mfgkw)
Datum:

Es gab schon mal als spontane Idee einen Beitrag von mir
(Beitrag "Festkommazahlen in Würde") zum Thema
Festkommazahlen in C++.

Nachdem ich das inzwischen tatsächlich nutze, etwas aufgebohrt habe und
vermutlich in Zukunft noch mehr dran frisieren werde, gehört es eher
hierher in die Codesammlung.

Der jeweils aktuelle Stand ist immer unter
http://mfgkw.dyndns.org/fixpoint_release.zip zu finden.
Verriss oder konstruktive Kritik gerne an mich.

Ich werde in diesem Thread bei markanten Änderungen kurz Bescheid geben
und bei Gelegenheit mal Vergleiche von verschiedenen Rechnern zeigen.

Seit der ersten Vorstellung in
Beitrag "Festkommazahlen in Würde"
hat sich vor allem geändert:

- etliche Fehler beseitigt
- unnötige Überläufe eliminiert
- std::numeric_limits<> für das template implementiert
- eine Debugvariante eingebaut, mit der man vor
  Wertebereichsüberläufen gewarnt wird und zum Schluß den
  kleinsten und größten insgesamt genutzten Wert erfragen kann
- eine Debugvariante eingebaut, die alle Berechnungen parallel
  in double nochmal macht und dadurch einen Vergleich ermöglicht
  (in einer fixpoint-Variable steckt dann auch eine double drin,
  mit einem Wert als wenn alles bisherige in double
  gerechnet worden wäre)
- sin() und cos() eingebaut (mit double-Berechnung als default,
  und der Möglichkeit, per Zusatzprogramm Quelltext zu erzeugen
  für eine Spezialisierung mit Interpolation in Tabellen, ohne
  double, mit wählbarer Stützweite)

Die Debugvarianten machen den Quelltext in der Headerdatei nicht
gerade lesbarer, sind aber sehr hilfreich, um Fehler durch
Über- oder Unterläufe zu erkennen.

Andere Funktionen aus <cmath> kommen erst bei Bedarf dazu.


mfgkw
Autor: Klaus Wachtler (mfgkw)
Datum:

- das intern verwendete itoa ist jetzt thread safe (bisher
  statischer Puffer)
- der generische cos() heißt jetzt auch so; bisher hieß er
  dummerweise ebenfalls sin()
- falls DEBUG_FIXPOINT_CHECK_RANGE gesetzt ist, gibt es jetzt
  zwei statische Methoden, die den Kleinst- und Größtwert des
  Typs als double liefern:
  static double checkRangeMinLimit()
  static double checkRangeMaxLimit()
  (damit kann man nach der Rechnerei die Werte von
  checkRangeMin bzw. checkRangeMax vergleichen)
Autor: Klaus Wachtler (mfgkw)
Datum:

- für AVR kann man jetzt auch wieder kompilieren, das war verloren
gegangen weil beim avr-gcc/g++ keine <limits> dabei ist ebensowenig wie
<cmath>.
Die habe ich jetzt frei dazu erfunden.

@Blockwart :-) : Macht es nicht Sinn, die auf Dauer zu avr-libc gleich
mit dazu zu packen? Ok, viele Leute nehmen nicht gerade C++ hier, aber
manchmal wäre es schon nett, wenn man die AVRs gleich behandeln könnte
wie andere Rechner.
Resourcen kostet <limits> ja nicht, es sind nur etwas kompliziert
geschriebene Konstanten.
Autor: Fabian G. (kjion) Benutzerseite
Datum:

Klaus Wachtler schrieb:
> @Blockwart :-) : Macht es nicht Sinn, die auf Dauer zu avr-libc gleich
> mit dazu zu packen? Ok, viele Leute nehmen nicht gerade C++ hier, aber
> manchmal wäre es schon nett, wenn man die AVRs gleich behandeln könnte
> wie andere Rechner.

Am sinnvollsten wäre es natürlich gleich eine komplette libstdc++ für
AVRs anzulegen ;-)
Da es aber viel Aufwand ist und man viele Teile daraus auch gar nicht
für AVRs verwenden will (wie zum Beispiel Exceptions) hat bisher noch
keiner Lust dazu gehabt (mich eingeschloßen).

Vielen würde aber vermutlich auch schon eine einfachste Implementierung
helfen, mit ein paar wichtigen Header-Dateien, Wrappern für new/delete
auf malloc/free, default-Handler für pure-virtual Aufrufe usw.

Bis dahin könnte ich auch noch einige C++ Header-Dateien beitragen:
http://sourceforge.net/apps/trac/xpcc/browser/trun...

Die machen nicht mehr als Funktionen aus der avr-libc in den
std-Namespace zu verschieben, auch hier, damit man Programme für PC und
AVR compilieren kann.

Gruß Fabian
Autor: Klaus Wachtler (mfgkw)
Datum:

Schön, daß es hier noch Mitstreiter gibt!

Nur mein cmath hätte ich mir dann natürlich auch sparen können :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net