random float



  • Hier wären nun alle Bits drin, wenn ich mich nicht irre:

    for(i = 0; i < 10; ++i)
    	{
    		c.i = rand();
    		c.i = c.i << 17;
    		c.i = c.i | (rand() << 1);
    		c.i = c.i | (rand() % 2);
    		printf("Int = %d Float = %e\n", c.i, c.f);
    	}
    


  • Belli schrieb:

    Ein anderes Problem ist wie erwähnt, daß ich nicht weiß, ob es auch ungültige Bitmuster gibt, die dann keinen gültigen float-Wert repräsentieren.

    Ein NaN ( not a number ) ist keine Zahl. Die Bitmuster von NaN stecken in den 4 Byte des float-Typen mit drin.



  • Ja, schon klar, aber wo? Soweit ich bisher durch Ausprobieren (und Wikipedia-Lesen) festgestellt habe, ist ein Wert untauglich, wenn der Exponent 255 ist. Wenn das tatsächlich die einzige untaugliche Kombination sein sollte, könnte man bei Auftreten zufällig eines der 8 Bits (des Exponenten) wieder löschen und hätte dann wieder einen float ...



  • Hallo,

    Bei deinem Code erhalte ich das gleiche Ergebnis wie bei meinem:
    Es werden zwar (haupsächlich) gültige floats ausgegeben.
    Leider stimmt aber die verteilung nicht.
    man müsste die bits im exponententeil so setzen. Dass die exponenten im verhältnis 10:1 zum vorigen auftreten:
    e038 soll 10 mal häufiger auftreten als e037 und 100mal öfter als e036

    mein ansatz wäre dafür:

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
    	srand(time(NULL));
    	char bit,bitr;
    	int x,i,j,k,l;
    	float*f;
    
    	for(x=0,i=0;i<5;i++)
    	{
    		bit=rand()%2;
    		x|=bit<<31;
    		for(bit=0,j=0,k=7;j<8;j++,k--)
    		{
    			for(bit=0,l=0;l<pow(2,k);l++) 
    //rand() muss 2^k mal 0 sein damit das bit auch 0 gesetzt wir
    			{
    				bitr=rand()%2;
    				if(bitr==1)
    					bit=1;
    			}
    				x|=bit<<(j+22);
    		}
    		for(j=0;j<23;j++)
    				{
    					bit=rand()%2;
    					x|=bit<<j;
    				}
    		f=&x;
    		printf("%f\n",*f);
    	}
    	return 0;
    }
    

    ich hab also nur die bits logarithmiert (bit8 wird 2^8 mal öfter gesetzt als bit1)
    das müsste man jetzt aber eben so umformen, dass es nicht für die einzelnen bits, sondern für die codierten dezimalzahlen gilt.

    Ich hoffe das war nicht zu verwirrend.

    mfg Christoph



  • Belli schrieb:

    Ja, schon klar, aber wo? Soweit ich bisher durch Ausprobieren (und Wikipedia-Lesen) festgestellt habe, ist ein Wert untauglich, wenn der Exponent 255 ist. Wenn das tatsächlich die einzige untaugliche Kombination sein sollte, könnte man bei Auftreten zufällig eines der 8 Bits (des Exponenten) wieder löschen und hätte dann wieder einen float ...

    Also hier weiter unten
    http://de.wikipedia.org/wiki/NaN
    steht, das es 223 NaNs gibt 😮



  • mathematikpraktikant schrieb:

    Also hier weiter unten
    http://de.wikipedia.org/wiki/NaN
    steht, das es 223 NaNs gibt 😮

    Tja, dann weiß ich auch nicht mehr weiter. Bisher bin ich davon ausgegangen, daß alle Werte mit 0xFF im Exponenten NaN sind, das müssten dann aber meiner Meinung 224 sein ... 😕
    @Symbian:
    Also die bei mir bisher auftretenden ungültigen floats konnte ich wie beschrieben dadurch 'reparieren', daß ich ein zufällig gewähltes Bit aus dem Exponenten gelöscht habe.
    Wie das nun mit der Verteilung aussieht, da bin ich völlig überfragt, das wird mir zu mathematisch.
    Ich kann mir nicht vorstellen, wie ich einerseits auf die Verteilung Einfluss nehmen soll, andererseits aber von rand() gelieferte Zufallswerte verwenden soll.
    Sorry, aber hier ist mein Latein zu Ende.


Anmelden zum Antworten