Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Irdorath, statixx, Teh Wizard of Aiz


 Thema: pOT-Informatiker, Mathematiker, Physiker V ( Haaahaaaaahaa...LabView...Hahahahaaa...oh wow )
« vorherige 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 nächste »
erste ungelesene Seite | letzter Beitrag 
Gore

Gori
http://projecteuler.net/
22.02.2011 19:08:10  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
Coole Seite, Gore.

Ich werd verrückt. Ich hab eine % Anzeige in meiner Simulation, und habe das Gefühl, dass ich die zu oft update und damit meine Berechnung verlangsame.

 
Code:
size_t N = 100000000;
for(i = 0; i < N; i++)
{
    ...
    if(i * 100 % N == 0)
        printf("\rSimulating...: \t\t\t\t%2d%%", (int)(100L * i / N));
}


Irgendwie funktioniert diese If-Bedingung nicht richtig. Es wird gar nicht angezeigt!
22.02.2011 20:03:55  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
_Ac_

Phoenix
der Modulo-Operator ist "stärker" als + und -

if((i*100)% N == 0)

sollte gehen.

Und ja, if in for-Schleifen sind langsam

//ah moment, das ist ja ein * peinlich/erstaunt
hmm... dann sollte es ja schon gehen...
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von _Ac_ am 22.02.2011 20:12]
22.02.2011 20:11:18  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
aber printf wird doch noch langsamer sein?

Wie würde ich sowas optimalerweise lösen?

Dein Vorschlag geht auch nicht. Hier ein Minimalbeispiel:

 
Code:
#include <stdio.h>

int 
main(int argc, char **argv) 
{
    int i, N = 100000000;

    for(i = 0; i < N; i++)
        if((i * 100) % N == 0)
            printf("\rSimulating...: \t\t\t\t%2d%%", (int)(100L * i / N));
    printf("\n");
    return 0;
}


/e: Das gibt bei mir genau einmal ne Zahl aus, und zwar 21%. Auch bei mehrmaligem Ausführen... o_O
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von OliOli am 22.02.2011 20:14]
22.02.2011 20:13:36  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
RichterSkala

AUP RichterSkala 31.12.2010
zwei verschachtelte for-Schleifen und die äußere hat das Print?
22.02.2011 20:14:22  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
 
Zitat von RichterSkala

zwei verschachtelte for-Schleifen und die äußere hat das Print?


Alter, das ist mal intelligent. Breites Grinsen
22.02.2011 20:14:48  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Aclebeth

Arctic
 
Zitat von OliOli

aber printf wird doch noch langsamer sein?

Wie würde ich sowas optimalerweise lösen?

Dein Vorschlag geht auch nicht. Hier ein Minimalbeispiel:

 
Code:
#include <stdio.h>

int 
main(int argc, char **argv) 
{
    int i, N = 100000000;

    for(i = 0; i < N; i++)
        if((i * 100) % N == 0)
            printf("\rSimulating...: \t\t\t\t%2d%%", (int)(100L * i / N));
    printf("\n");
    return 0;
}


/e: Das gibt bei mir genau einmal ne Zahl aus, und zwar 21%. Auch bei mehrmaligem Ausführen... o_O



oh in der tat liegt das Problem woanders: if((i * 100) % N == 0)
das Fett markierte wird wieder ein int und durch die Multiplikation zu groß.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Aclebeth am 22.02.2011 20:44]
22.02.2011 20:31:47  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Gore

Gori
die nicht vorhandene klammerung macht mich fertig traurig
22.02.2011 20:33:10  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
funzt immer noch nicht wie ich will.

Habs mit 2 for-Schleifen gemacht, aber dennoch. Wütend

 
Code:
#include <stdio.h>

int main(int argc, char **argv) 
{
    size_t i, j, N = 1000000, haha = 0;

    for(j = 0; j < 100; j++) {
        printf("\rSimulating...: \t\t\t\t%2d%%", (int)j);
        for(i = 0; i < N / 100; i++)
            haha++;
    }
    
    printf("\n"); 
    for(i = 0; i < N; i++)
       printf("\rSimulating...: \t\t\t\t%2d%%", (int)(100L * i / N));
        
    printf("\n");
    return 0;
}


Das zweite geht. WIESO???
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von OliOli am 22.02.2011 20:43]
22.02.2011 20:40:51  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Wraith of Seth

wraith_of_seth
Irgendwie mag ich diese mathematische Art, Dinge beizubringen nicht.

Als Physiker kann man sich darauf verlassen, für (fast) alles irgendwo Lösungen oder zumindest Hinweise dazu finden. Wenn man also irgendwo hängt, kann man sich Inspiration holen und weitermachen.

Aber Mathematiker? Die geben dir eine Aufgabe und lassen dich erstmal hängen.

----

@Virtus: Danke nochmal!

You need a reason to live! You don't need excuses to die!
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Wraith of Seth am 22.02.2011 20:41]
22.02.2011 20:41:13  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
Es ist weniger das if in der Schleife, das langsam ist, als mehr die Bedingung - Moduloberechnung ist langsam.

 
Code:
    //Möglichkeit 1
    for (i = 0; i < 1000000; ++i) {
        for (j = 0; j < 100; ++j) {
            r = calculate(i*100 + j);
        }
        
        print(i);
    }
    
    //Möglichkeit 2
    for (i = 0; i < 100000000; ++i) {
        r = calculate (i);
        
        if ( i % 100 == 0)
           print(i);
    }
    
    //Möglichkeit 3
    for (i = 0; i < 100000000; ++i) {
        r = calculate (i);
        
        if (!(i & 100))
           print(i);
    }


Methode 1 und 3 sind dabei fast gleich schnell - bei meinen Tests eben war die 3 sogar etwas schneller. Methode 2 war etwa um ein drittel langsamer.
Es ist aber wohl auch net die Berechnung als mehr die Ausgabe selbst, die langsam ist. Weniger oder asynchrone Ausgaben lösen das Problem.
22.02.2011 20:43:01  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
 
Zitat von B0rG*


Methode 1 und 3 sind dabei fast gleich schnell - bei meinen Tests eben war die 3 sogar etwas schneller. Methode 2 war etwa um ein drittel langsamer.
Es ist aber wohl auch net die Berechnung als mehr die Ausgabe selbst, die langsam ist. Weniger oder asynchrone Ausgaben lösen das Problem.


Danke, das dritte ist natürlich echt elegant. Nunja, ich hab halt wirklich sone Schleife über bisweile 100mio Durchläufe und wollte daher die Ausgaben limitieren.
22.02.2011 20:44:47  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
_Ac_

Phoenix
Ha, gerade rausgefunden wieso's nicht geht:
printf() schreibt irgendwie nur das letzte, wenn ich's mit cout mache, gehts...
C-Funktionen sind so beschissen...
22.02.2011 20:47:16  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
Was ja sehr richtig ist. Mach einfach noch weniger ausgaben (eine alle paar Sekunden oder so) und s passt.

e/ Auf Oli bezogen
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von B0rG* am 22.02.2011 20:48]
22.02.2011 20:47:49  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
 
Zitat von _Ac_

Ha, gerade rausgefunden wieso's nicht geht:
printf() schreibt irgendwie nur das letzte, wenn ich's mit cout mache, gehts...
C-Funktionen sind so beschissen...


Naja - du solltest vielleicht auch flushen. Augenzwinkern
22.02.2011 20:50:49  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
_Ac_

Phoenix
peinlich/erstaunt
dann reich ich das mal an Oli weiter: Klammern richtig setzen und flushen
 
Code:
int 
main(int argc, char **argv) 
{
    int i, N = 100000000;

    for(i = 0; i < N; i++)
     {  
         if((i * 100) % N == 0)
          {
             printf("\rSimulating...: \t\t\t\t%2d%%", (int)(100L * i / N));
             printf("\n");
           }
      }    
return 0;
}


funktioniert tadellos
22.02.2011 20:56:24  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
 
Zitat von B0rG*

Was ja sehr richtig ist. Mach einfach noch weniger ausgaben (eine alle paar Sekunden oder so) und s passt.

e/ Auf Oli bezogen


Hm naja diese bitwise operation... Die erste Möglichkeit erlaubt es mir, genau 100 mal den Stand auszugeben, das ist was ich will. Das kriegt man glaube ich mit den bitweisen dingern nicht hin oder?

/e: _Ac_: Ich will das ja in einer Zeile stehen haben.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von OliOli am 22.02.2011 21:01]
22.02.2011 21:01:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
 
Zitat von OliOli

Hm naja diese bitwise operation... Die erste Möglichkeit erlaubt es mir, genau 100 mal den Stand auszugeben, das ist was ich will. Das kriegt man glaube ich mit den bitweisen dingern nicht hin oder?



 
Code:
 !(a & b) 

Ist bloß eine "Abkürzung" für [Edit: Das ist falsch, siehe weiter unten.]
 
Code:
 a % b == 0 

(Wobei mich wundert, dass der Compiler das nicht umwandelt, aber so genau habi mi da mit jetz net beschäftigt)

Du könntest also rausfinden Modulo was es null sein muss, damit dus anzeigen willst, das _vor_ der Schleife einmal Ausrechnen und dann immer überprüfen.

e/ Also sowas:
 
Code:
    int N, i, q;
    N = 100000000;
    q = N / 100;
    for (i = 0; i < N, ++i) {
        calculate(i);
        
        if (!(i & q)) {
           print(i);
        }    
    }


Das sichert aber nicht, dass die letzte Ausgabe auch wirklich aus dem letzten Schleifendurchlauf stammt - für den Fall, dass dir das wichtig ist.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von B0rG* am 23.02.2011 1:59]
22.02.2011 21:04:51  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
Wofür bin ich dann zu doof?

 
Code:
#include <stdio.h>

int main(int argc, char **argv) 
{
    size_t N = 1000000;
    int i;
    printf("\n"); 
    for(i = 0; i < N; i++)
        if (!(i & 100))
            printf("%d\n",i);
        
    printf("\n");
    return 0;
}


/e: Es sieht ziemlich so aus, als würde er die 100 als bits auffassen. Aber ein (int) cast bringt auch nichts.
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von OliOli am 22.02.2011 21:12]
22.02.2011 21:11:05  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
 
Zitat von _Ac_

peinlich/erstaunt
dann reich ich das mal an Oli weiter: Klammern richtig setzen und flushen
 
Code:
int 
main(int argc, char **argv) 
{
    int i, N = 100000000;

    for(i = 0; i < N; i++)
     {  
         if((i * 100) % N == 0)
          {
             printf("\rSimulating...: \t\t\t\t%2d%%", (int)(100L * i / N));
             printf("\n");
           }
      }    
return 0;
}


funktioniert tadellos


Ich dachte ja eher an fflush(stdout). Dass eine leere Zeile flusht ist afaik nicht standardisiert.
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von [Dicope] am 22.02.2011 21:18]
22.02.2011 21:18:20  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
unglaeubig gucken
 
Zitat von B0rG*

 
Code:
 !(a & b) 

Ist bloß eine "Abkürzung" für
 
Code:
 a % b == 0 




The fuck?

a = 01001000 (72)
b = 00010000 (32)

a & b = 00000000
!(a & b) = 11111111

a % b = 00001000
22.02.2011 21:21:00  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
_Ac_

Phoenix
 
Zitat von [Dicope]

Ich dachte ja eher an fflush(stdout). Dass eine leere Zeile flusht ist afaik nicht standardisiert.


hab ich gerade probiert und das funktioniert nicht Mata halt...
22.02.2011 21:22:53  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
 
Zitat von [Dicope]


The fuck?

a = 01001000 (72)
b = 00010000 (32)

a & b = 00000000
!(a & b) = 11111111

a % b = 00001000



Das ist ein logisches nicht.
Ich gebe aber zu nicht zu lange drüber nachgedacht zu haben, mag falsch sein, hab jetzt leider auch grad keine Zeit mehr. Ich melde mich in paar Stunden Augenzwinkern.
22.02.2011 21:25:40  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
ist falsch.

Ich habe jetzt die doppel-schleife und fflush(stdout) benutzt.

Danke an alle, ich wollte gar nicht so viele Posts provozieren. traurig
22.02.2011 21:27:52  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
Mir is beim aus der Tür gehen eingefallen warum das natürlich falsch ist -.-.

Es geht mit Zweierpotenzen (wenn man die Null irgendwie mitbehandelt) und ansonsten hat das ein etwas anderes Verhalten. Kommt davon wenn man sich kurz erinnert und zu faul ist groß nachzudenken.

Was du mit solchen Operationen aber durchaus hinkriegen kannst eventuell ist das Verhalten, das du möchtest. Weil ne Modulorechnung dafür ja eigentlich schon etwas Overkill ist. Das lässt mich jetzt irgendwie nich mehr los peinlich/erstaunt.
23.02.2011 1:07:33  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
RichterSkala

AUP RichterSkala 31.12.2010
aber ist die Condition an und für sich nicht schon overkill und die Variante mit der verschachtelten Schleife (wenn man die Zählervariable nicht braucht) bietet eh die bessere Performance?
23.02.2011 1:11:47  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
B0rG*

Gordon
Als ob das ein Argument wäre peinlich/erstaunt.
Weiß nich, aber die geschachtelten Schleifen wirken auf mich irgendwie nich elegant... das muss doch hübscher gehen.
23.02.2011 1:58:05  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
Ich finde dazu irgendwie nicht viel, aber wie zitiere ich innerhalb von Source Code? Wenn ich also sagen will, den und den Algorithmus aus diesem und jenem Paper genommen zu haben.

Gibts da eine Konvention?
23.02.2011 9:57:55  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Gore

Gori
c++doc? mit den Augen rollend
23.02.2011 10:32:35  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[smith]

AUP [smith] 29.07.2010
Bei uns gibt es keine direkte Konvention, es wird allerdings erwartet dass man bei großen übernommenen Teilen oder Algorithmen im Quellcode selber einen Kommentar zur Quelle macht, wenn auch nicht zwingend formal wie in geschriebenem Text. Üblicherweise wird in der jeweiligen begleitenden Arbeit, soweit es diese denn gibt, dann eh genauer auf die verwendeten Algorithmen und ihren Sinn + Laufzeit eingegangen, da dann natürlich mit ausführlicherer Quellenangabe.

Wenn du nur den Quellcode hast pack soviel wie möglich Quelleninformation als Kommentar dazu, wenn du dazu einen Text hast halte dich eher kurz und verweise auf entsprechende Textstelle.

Echte Quellcode-Doku schreibt ja leider eh keine Sau, was mich gerade bei meiner Diplomarbeit doch sehr sehr ankotzt traurig
23.02.2011 10:43:15  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: pOT-Informatiker, Mathematiker, Physiker V ( Haaahaaaaahaa...LabView...Hahahahaaa...oh wow )
« vorherige 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 nächste »

mods.de - Forum » Public Offtopic » 

Hop to:  

Thread-Tags:
Mod-Aktionen:
15.05.2011 01:10:46 Sharku hat diesen Thread geschlossen.
27.01.2011 10:47:47 Rufus hat diesem Thread das ModTag 'pimp' angehängt.

| tech | impressum