C++Guns – RoboBlog blogging the bot

06.05.2020

C++ Guns: generate random bits - std C++ way

Filed under: Allgemein — Tags: — Thomas @ 05:05

I found only one std C++ way to generator random bool value: using std::bernoulli_distribution. It returns bool values and has a default constructor with probability p=0.5. So the generated boolen are "uniform" distributed.

This is perhaps the slowest variant. The internet is full of better ideas. Some use std C++ random classes but they all need some extra code to work. For example: cast int to bool, extract one bit from a 32bit integer value.

#include <random>

std::random_device rd;
std::mt19937 g(rd());
std::bernoulli_distribution dis_true_false;

if(dis_true_false(g)) {
   // heads
} else {
   // tails
}

25.02.2020

C++ Guns: Special Members

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

Engineering Distinguished Speaker Series: Howard Hinnant

Make yourself pretty coloring

special_members

special_members.ods

06.02.2020

C++ Guns: Style Guide

Filed under: Allgemein — Tags: — Thomas @ 19:02

Nicht zwingend HPC, ehr allgemein.


Strings werden mit std::string (pure C++) und/oder QString (Qt) dargestellt. Der C-String (char*) wird nicht mehr benutzt.

Das Konzept des C-Strings ist, die einzelnen Zeichen aneinander zu reihen und das Ende des Strings durch ein besonders ausgezeichnetes Zeichen darstellten: NULL. Das NULL Zeichen nennt man auch Sentinel. Dieses Prinzip ist auch 2020 Fehlerquelle #1 in Software.

In C++ werden Strings durch eine Aneinanderreihung von Zeichen dargestellt und zusätzlich die Länge des Strings separat gespeichert. Hierfür wird die Klasse std::string benutzt, welche intern 8-Byte Zeichen benutzt. Für GUI Anwendungen wird die Klasse QString verwendet, welche 16-Byte Zeichen benutzt. Um auch "Sonderzeichen" wie Umlaute oder EUR immer korrekt darzustellen.

Das Konzept des Sentinels ist nicht schlecht, es wurde sogar in C++17 standardisiert. Damit war es möglich in C++20 "Ranges" einzuführen. Eine grundsätzlich neue Technologie in der std C++ Welt.


02.12.2019

C++ Guns - Graph - Dijkstra Beschleunigungstechniken

Filed under: Allgemein — Tags: — Thomas @ 09:12

Dijkstra - Single source shortest paths

Testgebeit DGM triangulation Rheinausschnitt mit 2.7 Millionen Punkte und 8.1 Millionen Kanten. Das Gebiet ist in Nord Süd Richtung lang gestreckt und in Ost West Richtung schmal. Es soll ein kürzester Path von einem Startpunkt auf der Ostrand hin zur Westrand gefunden werden. Der überwiegende Teil des Gebiets muss im Vergleich zur Luftlinie dabei nicht durchlaufen werden.

Standard Dijkstra
Die Standard Variante von Dijkstra berechnet vom Startknoten zu jedem anderen Knoten im Mesh den kürzesten Path.

Beschleunigungstechnik Early Termination
Sobald der Zielknoten als finish markiert wird, beendet der Algorithmus. Muss vom Start zum Ziel, wie in diesem Beispiel, nicht das komplette Gebiet durchlaufen werden, ergibt diese Technik eine Beschleunigung.

Beschleunigungstechnik Bidirectional Search
Es kann eine zweite Suche vom Zielknoten hin zum Startknoten auf dem transponierten Graph gestartet werden. Die beiden Dijkstra Instanzen werden nicht parallel, sondern abwechseln angestoßen und iterieren je ein mal. Sobald ein Knoten von einer Suchinstanz als finish markiert wird, welche in der anderen Suchinstanz schon als finish markiert worden ist, terminiert der Algorithmus.
Der ausgegebene Path muss nicht zwangsläufig der kürzeste Path von s nach t sein. Es ist möglich, dass es einen kürzeren Path über eine Kante gibt, welche in beiden Suchinstanzen auf gesehene, aber noch nicht finished Knoten zeigt.

Laufzeiten: GCC 8.2 -O2 -funroll-loops AMD FX-8350 Eight-Core Processor 4 GHz
Standard Dijkstra 2.79 sec
Early Termination 1.19 sec speedup 2.3
Bidirectional Search 0.925 sec speedup 3.0

rheinmodellumgriff3

Created with GIMP

Created with GIMP

Created with GIMP

Created with GIMP

19.11.2019

C++ Guns: ACPL proudly presents: ElapsedTimer

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

ElapsedTimer: Measure amount of time with a monotonic clock.

https://sourceforge.net/p/acpl/code/ci/master/tree/acpl/Examples/ElapsedTimer/main.cpp

#include <iostream>
#include <thread>

#include <core/util/ElapsedTimer.hpp>

using namespace acpl;
using namespace std::chrono_literals;

int main() {
    std::cout << "Start timer and wait for 2 seconds ...\n";
    auto timer = ElapsedTimer::create();
    std::this_thread::sleep_for(2s);
    std::cout << timer.elapsed().count() << " seconds later\n";
    return 0;
}

15.11.2019

C++ Guns: P1935R0 A C++ Approach to Physical Units

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

Unbedingt lesen!!!

P1935R0 A C++ Approach to Physical Units

02.11.2019

GIT SHA hash in QT as macro created at compile time

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

print git hash in qt as macro created at compile time

This works for me:

.pro File:
DEFINES += GIT_CURRENT_SHA1="\\\"$(shell git rev-parse HEAD)\\\""

C++ File:
std::cout << __DATE__ << " " << __TIME__ << " GIT " << GIT_CURRENT_SHA1 << "\n";

The build directory must be inside the GIT directory of the project.

Nov 2 2019 16:41:22 GIT bf2d25f47afe2c8befcfa6fefb25acbb462d43b3

06.10.2019

C++ Guns: acpl Histogram2D: Ordnungszahl vs. Atomgewicht

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

Steigt das Atomgewicht mit der Ordnungszahl an? Hmmm. Lasst uns das in einem 2D Histogramm überprüfen!

ordnungszahlatomgewichthist2d

        PSE pse;

        std::vector<double> ordnungszahlen;
        for(uint32_t i=1; i <= pse.nElements(); ++i) {
            ordnungszahlen.push_back(i);
        }
        acpl::HistogramAxis Xaxis("Ordnungszahl", acpl::FixBinSize{50}, acpl::makeDataIntervalClosed(ordnungszahlen));

        std::vector<double> gewicht;
        for(uint32_t ordnungszahl=1; ordnungszahl <= pse.nElements(); ++ordnungszahl) {
            gewicht.push_back(pse.atomgewicht(pse.atomByOrdnungszahl(ordnungszahl)));
        }
        acpl::HistogramAxis Yaxis("Atomgewicht", acpl::FixBinSize{20}, acpl::makeDataIntervalClosed(gewicht));

        acpl::Histogram2D hist(Xaxis, ordnungszahlen, Yaxis, gewicht);
        std::cout << hist;

16.09.2019

C++ Guns: BIG UNICODE

Filed under: Allgemein — Tags: — Thomas @ 20:09

Vorheriger Post: Search C++ Guns: C++ && Unicode
Vorvorherige Post: Qt && Unicode

es gibt BIG unicodes
das sind die unicodes zahlen mit mehr als 4 digits
und da gibts tolle symbole
wie z.b. die spielkarten 1 2 3... bube könig ass und so
DIE WILL ICH HABEN :D
normal leitet man ein unicode charater mit \u ein
weil wir ja alle utf8 haben brauchen wir für UTF32 halt 8 digits
damit dass der compliler check, gibt es nun auch \U
also
u8"\U0001F0A1"
HELL is near

29.07.2019

C++ Guns: P1161R3 Deprecate uses of the comma operator in subscripting expressions

Filed under: Allgemein — Tags: — Thomas @ 14:07

Endlich.

ND Arrays in std C++ wir kommen

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1161r3.html

Don't forget GCC -Werror=unused-value

array[x]      // Ok
array[(x,y)]  // Ok, uses y as index/key
array[x,y]    // Deprecated, uses y as index/key
« Newer PostsOlder Posts »

Powered by WordPress