Chiarimento alternativa sqrt

di Anonimizzato7658 il
12 risposte
Ciao a tutti,cercando un metodo alternativo e possibilmente piu veloce di sqrt, mi sono imbattuto in questo. Di funzionare funziona, ma non capisco cosa fa.Cortesemente potreste aiutarmi? Grazie..
float Sqrt(float val)
{
	int tmp = *(int *)&val;
	tmp -= 1<<23;
	tmp = tmp >> 1;
	tmp += 1<<29;
	return *(float *)&tmp;
}

12 Risposte

  • Veramente non mi pare funzioni ...
  • Per le prove che ho fatto io si.. Puoi comunque spiegarmi cosa fa cortesemente? Grazie mille

    Inviato dal mio LG-D802 utilizzando Tapatalk
  • Beh ... provato con 9 e 144 e sbaglia in tutti e due i casi ... "approssima" la radice quadrata ma l'errore è grande ...
  • Vabbe.. Ma me lo puoi spiegare cosa cerca di fare ugualmente?

    Inviato dal mio LG-D802 utilizzando Tapatalk
  • 
    int tmp = *(int *)&val;
    
    questa è veramente originale!
  • vbextreme ha scritto:


    
    int tmp = *(int *)&val;
    
    questa è veramente originale!
    Perche'?
    E trucchettoso, ma funziona!

    Non e' la stessa cosa di
    
    int tmp = (int)val;
    
    Questa fa una conversione, mentre la precedente mantiene i bit cosi' come sono
  • vbextreme ha scritto:


    
    int tmp = *(int *)&val;
    
    questa è veramente originale!
    Non c'è nulla di strano ... Sempre usato, dai primi compilatori c per dos...

    E usatissimo con i micro...
  • E perché non viene usato il casting normale?
  • Ovvero?

    In realtà è più elegante utilizzare una union, ma l'effetto è uguale ...
    
    	union
    	{
    		int i;
    		float f;
    	} x;
    
    	x.f = 1.0;
    
    	printf("%d\n", x.i);
    
  • Questa fa una conversione, mentre la precedente mantiene i bit cosi' come sono
    mi era sfuggita....
    grazie
Devi accedere o registrarti per scrivere nel forum
12 risposte