C++Guns – RoboBlog blogging the bot

28.03.2013

Qt Source und kleine Perlen

Filed under: Allgemein — Tags: , , — Thomas @ 23:03

Ich habe in den letzten 3 Tagen viel Qt Source gelesen und da war schon viel Wirr und Krams dabei. Aber auch kleine Perlen wie diese Zeile in QRectF QPolygonF::boundingRect() const zeige

register const QPointF *pd = constData();
for (int i = 1; i < size(); ++i) { ++pd; }

Da kennt ein Performance-Fan das Keyword register. Ich war richtig überrascht und erfreut auch mal ein Stück optimierten Code zu finden.
Erklärung: das Keyword register sagt dem compiler, dass der Pointer bitte die ganze Zeit über in einem CPU Register bleiben soll. Die Registert sind ja die schnellsten Speicher die es in so einer CPU gibt, und da der Pointer in der nachfolgenden Schleife etliche mal benutzt wird, macht das auch Sinn.
Sogar das const keyword ist dabei. Das sagt dem Compiler, dass er diesen Pointer nicht in den Hauptspeicher zurück speicher muss, da er zu 100% nicht verändert worden ist. Und der Zugriff auf den Hauptspeicher ist im Vergleich zu dem Registert bestimmt 1000x langsamer.

++pd;
Selbst bei dieser recht unbedeuteten Zeile Code gibt es etwas zu sagen. Es gibt eine Menge Post im Internet die vermuten, dass ++i schneller sei als i++ [1] [2]. Aber der Compiler wird das schon optimieren. Jedenfalls weiß der Autor von QPolygonF::boundingRect() das, und ich finde es schön :)

[1] http://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i
[2] http://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i-in-c

26.03.2013

2^168605209-1 not prime

Filed under: Allgemein — Tags: — Thomas @ 10:03

Ich dacht mir, gibt das doch mal in den Taschenrechner ein und überprüfe, ob diese Mersenne Zahl wirklich keine Primzahl ist.
Normale Taschenrechner können so große Zahlen nicht handeln, aber zum Glück gibt es ja die Konsolentools. Z.B. das Programm bc.

echo 2^168605209 | bc -l > zahl
wc -ml zahl
746401 52248027 zahl

Das Ergebnis hat also 51501626 Ziffern (Man muss das Zeilenfortsetzungszeichen "\" abziehen).
Die Zahl 40695358776195832999 soll angeblich ein Faktor sein. Wenn man bc damit füttert, bekommt man eine halbe Stunde später das Ergebnis. Hier die letzten paar Ziffern der Zahl: 432489.0
Wie man sieht ist die Nachkommastelle 0 und damit die Zahl ein ganzer Teiler.

wc -ml ergebnis
746401 52248009 ergebnis

Das Ergebnis hat also 51501608 Ziffern. Halt! Der Dezimalpunkt und die Nachkomma Null zählen nicht mit, also 51501606 Ziffern.
Das macht ein Unterschied von 18 Ziffern gegenüber der Mersenne Zahl. Und der Faktor hat 20 Stellen. Na wo könnten denn die andern 2 Stellen geblieben sein? ;)

13.03.2013

5V to 1.2V

Filed under: Allgemein — Tags: — Thomas @ 22:03

Hier mal eine komische Schaltung um 1.2V aus 5V zu gewinnen. Wenn man annimmt, dass kein nennenswerter Ladestrom in den Akku fließt und die LCD Uhr weniger als 1mA verbraucht, dann sollte bei der Konstruktion nicht mehr als 1.4V jemals an der Batterie anliegen. Durch den extrem geringen Strom fällt die Vorwärtsspannung der Dioden weit ab. Auf 0.3V schätze ich mal.
Dadurch wird der 1.2V Akku nicht überladen.
Ob ein leerer Akku durch diese Schaltung auch geladen wird ist fragwürdig. Aber das wird sowieso niemals notwendig sein :D

1.2V

08.03.2013

Spannungsverlauf NiMH 80mAh Knopfzelle

Filed under: Allgemein — Tags: — Thomas @ 11:03

Wollt mal wissen, ob mein Lagegerät auch mit einer Knopfzelle umgehen kann. Leider hat die dU Abschaltung nicht funktioniert.
Nach etwa 50min war sie schon voll.

knopfzelle_uebersicht

knopfzelle_spannung

02.03.2013

Pythons Zuhause

Filed under: Allgemein — Thomas @ 19:03

So, oder so ähnlich sieht dem Python sein Zuhause aus ;)

terra

Powered by WordPress