Zufälliges Erzeugen von beliebigen gültigen double-Gleitkommazahlen



  • Hallo,

    zu allererst weiss ich natürlich, dass das Thema schon öfters diskutiert wurde, allerdings bin ich über die Suchfunktion nicht wirklich auf eine vernünftige Antwort für mein Problem gestossen.

    Mein Anliegen: ich möchte den gesamten Bereich gültiger double-Zahlen abdecken (beliebige Mantisse, Exponent und Vorzeichen). Im optimalen Falle sind also auch denormalisierte Zahlen enthalten.

    Hat vielleicht jemand nen Ansatz, wie sich so etwas realisieren lässt?

    (Gehört zwar nicht in diesen Forumsbereich, aber: theoretisch kann zur Problemlösung auch auf den Assembler-Befehlssatz des zugrundeliegenden Prozessors (Itanium2) zurückgegriffen werden).

    Dank und Gruss,
    Heinz



  • Hinreichend viele ints zufällig erzeugen, in ein Array packen, das Array als double interpretieren. Die paar ungültigen Werte kannst du von Hand rausfiltern.



  • Hi,

    danke für deine Antwort. Bin mir nicht ganz sicher, ob ich sie richtig verstanden hab. Also soll ich ein Array erstellen, in jeder Position einen zufälligen Integerwert erzeugen (komplette 64 bit für unsigned long?) und das ganze dann als gaaaaaanz lange konkatenierte Integerzahl (bzw. danach als double) interpretieren?

    Unabhängig davon, dass ich nicht so recht weiss, wie das mit dem Interpretieren des Arrays als double funktioniert, dürfte ich bei dem Vorgehen fast ausschliesslich double-Zahlen bekommen, die an der oberen Grenze der gültigen double-Zahlen sind und somit keiner sonderlich sinnvollen Verteilung unterliegen.

    Oder habe ich deine Anleitung missverstanden?

    Gruss, Heinz

    EDIT: Ich Depp! Jetzt ist mir glaub ich klar geworden, wie das gemeint war. Einfach die zufällig erzeugten Integer-64bit als die 64bits der double-Zahl interpretieren. War das so gemeint? (Das mit dem Array hat mich ein wenig verwirrt).



  • Das dürfte aber villeicht ein Problem geben weil die rand() - Funktion nicht den kompletten Wertebereich von int abdeckt. Wie wärs denn einfach so:

    char r[sizof(double)];
    for(int i=0; i<sizeof(double); ++i) {
        r[i] = rand();
    }
    double d = * ( (double*) r );
    

    edit: das scheint net richtig zu funktionieren... Kommt ziemlich oft einfach nur 0 raus.



  • FireFlow schrieb:

    edit: das scheint net richtig zu funktionieren... Kommt ziemlich oft einfach nur 0 raus.

    Warum wohl? Weil rand Zahlen zwischen 0 und 1 liefert du Knaller 😉



  • a schrieb:

    FireFlow schrieb:

    edit: das scheint net richtig zu funktionieren... Kommt ziemlich oft einfach nur 0 raus.

    Warum wohl? Weil rand Zahlen zwischen 0 und 1 liefert du Knaller 😉

    Achtung... stets Reihenfolge beachten:
    Denken - Schreiben - Nochmal denken - Nochmal durchlesen - (für die nicht so gebildeten kommt hier nochmal denken) - Abschicken



  • FireFlow schrieb:

    edit: das scheint net richtig zu funktionieren... Kommt ziemlich oft einfach nur 0 raus.

    Wie gibst Du denn den double aus? Mit printf("%f", d)?

    Dann ist das nur ein Problem der Ausgabeformatierung, die bei kleinen Zahlen 0.0..0 anzeigt, wenn das Ergebnis in Wirklichkeit 1.72022e-267 ist, oder so. Laß dir von printf die Zahlen in der wissenschaftlichen Sicht anzeigen ("%g"), dann müßte das passen, auch wenn man natürlich statistisch häufiger kleine Zahlen bekommt (weil dort die double-Zahlen dichter liegen, also öfter erraten werden, aber das ist ja durchaus im Sinne des OP, wenn ich das richtig verstehe).



  • FireFlow schrieb:

    Wie wärs denn einfach so:

    char r[sizof(double)];
    for(int i=0; i<sizeof(double); ++i) {
        r[i] = rand();
    }
    double d = * ( (double*) r );
    

    edit: das scheint net richtig zu funktionieren... Kommt ziemlich oft einfach nur 0 raus.

    Daniel E. schrieb:

    Wie gibst Du denn den double aus? Mit printf("%f", d)?

    Dann ist das nur ein Problem der Ausgabeformatierung, die bei kleinen Zahlen 0.0..0 anzeigt, wenn das Ergebnis in Wirklichkeit 1.72022e-267 ist, oder so. Laß dir von printf die Zahlen in der wissenschaftlichen Sicht anzeigen ("%g"), dann müßte das passen, auch wenn man natürlich statistisch häufiger kleine Zahlen bekommt (weil dort die double-Zahlen dichter liegen, also öfter erraten werden, aber das ist ja durchaus im Sinne des OP, wenn ich das richtig verstehe).

    Besten Dank an euch beide. 👍
    Das ist ziemlich genau das, was ich gesucht habe.


Anmelden zum Antworten