Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: GentooForum.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

06.05.2009, 22:43

Compiler rundet

Hallo,

ich habe eine Zeitmessung so gemacht:

Quellcode

1
2
3
4
5
6
7
8
9
10
 clock_gettime(CLOCK_REALTIME, &tp);
    start = 1e9 * tp.tv_sec + tp.tv_nsec;

    //....

    clock_gettime(CLOCK_REALTIME, &tp);
    stop = 1e9 * tp.tv_sec + tp.tv_nsec;
    time = (stop - start) * 1e-9;

    std::cout << "\t" << time <<  "\t[sec]" << std::endl;


Auf der einen maschine wird time wirklich als z.B. 2.12098 ausgegeben.
Auf der anderen dann aber IMMER abgerudnet auf 2.12.
Das will ich nicht.

Alleine schon die differenz stop-start ist dann gerundet auf 2.12e+09 oder so ähnlich.
Wie kann ich dieses problem umgehen und IMMER eine 5-stellige rundung haben also das ich immer 5 nachkommastellen haben.

Ich habe es mit den C++ std::setw bzw. setprecision versucht aber auch da wird abgerundet. Könnnte es an der Locale liegen?

2

07.05.2009, 08:41

Basierend auf http://www.cplusplus.com/reference/iostr…base/precision/ macht das

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ cat p.cpp
#include <iostream>
#include <iomanip>
using namespace std;

int main () {

    double f = 3.14159;

    cout.setf(ios::fixed, ios::floatfield);

    cout << setprecision(3) << f << endl;
    cout << setprecision(5) << f << endl;
    cout << setprecision(10) << f << endl;
    cout << setprecision(15) << f << endl;

    return 0;
}

$ g++ p.cpp -o p
$ ./p
3.142
3.14159
3.1415900000
3.141590000000000

... sieht gut aus. War das eine Antwort/Tip/Hint?
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>

3

07.05.2009, 12:48

Ja danke - so zeigt er mir über das fixed die nachkommastellen zwar an - aber ab der dritten ist die immer auf Null! Also immer 2.39000. Das ist auf meinem anderen system nicht so - da sind ab der dritten auch mal zerquetschte drin. Auch wenn ich über clock_gettime die mikrosekunden ansehe sind die immer auf 390000 und immer ab der dritten Null. Woran liegt das und wie kann ich das umgehen?

Allerdings zeigt er mir bei dem code von dir oben dasselbe an - also auch pi wird korrekt ausgegeben. Es scheint also ob die mikrosekunden irgenwie gerundet werden? nur warum?

4

08.05.2009, 08:23

Allerdings zeigt er mir bei dem code von dir oben dasselbe an - also auch pi wird korrekt ausgegeben. Es scheint also ob die mikrosekunden irgenwie gerundet werden? nur warum?

Nun, das hat mögl. Kernel/Hardware Gründe. Ich weis nicht genau, welche Funktion du aufrufst und was du gerade versuchts, aber die Auflösung der Kernel/Hardware-Timer ist im Grunde nicht x-beliebig klein.

AFAIR hat Windows lange Zeit eine maximale Auflösung von 50ms bei Timern gehabt. Sprich: du hast keinen schnellern Timer bauen können als 50ms. Aus.

Du kannst ja vlt. mal mit CONFIG_HZ des Kernels spielen.

Gibt mal den Source eines kleines Progies durch, welches diese Effekte bei dir macht.
http://www.dyle.org
IM-Account (Jabber!) sind auf meiner HP ...
There is no place like /home

http://www.gentooforum.de
http://www.gentoofreunde.org

<div>how to annoy a web developer?</span>