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
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)
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.
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
Datum:
Schön, daß es hier noch Mitstreiter gibt! Nur mein cmath hätte ich mir dann natürlich auch sparen können :-)



