Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [ANSI C] spaghetti pow()

    salve

    siccome ho scoperto che alcuni compilatori GCC , se si include math.h a inizio file, funzionano mentre altri no e siccome su quelli che funzionano ( ad esempio la versione 4 ) se metto -lm per forzare l' inclusione della libreria mi danno errore, ho deciso di evitare di perdere tempo con il GCC e di farmi a manina la funzione per elevare a potenza.

    Quella che mi serve di fatto e' una potenza di interi, ovvero base intera unsigned e potenza intera unsigned, che ovviamente tornera' sempre e solo interi unsigned ... mi dite cosa ne pensate ?

    grazie

    codice:
    #include <stdio.h>
    
    /********************************/
    /* Dichiarazione delle funzioni */
    /********************************/
    
    unsigned int potenza_interi(
    	unsigned int numero,
    	unsigned int potenza
    ); /* funzione per elevare a potenza di tipo intero 
          positivo o uguale a zero un numero anch' esso 
          di tipo intero e positivo o uguale a zero */
    
    
    
    /******************************/
    /* Definizione delle funzioni */
    /******************************/
    
    /* Definizione della funzione main */
    int main(
    	int 	argc, 
    	char 	*argv[]
    )
    {
    	
    	printf("Risultato: %i", potenza_interi(4, 2));
    	
    	/* fine funzione main */
    	return 0;
    }
    
    /* Definizione della funzione potenza_interi */
    unsigned int potenza_interi(
    	unsigned int numero,       /* Lavoro: numero da elevare a potenza */
    	unsigned int potenza       /* Lavoro: valore della potenza */
    )
    {
    	/* dichiarazione delle variabili locali alla funzione */
    	unsigned int elevato = 1;  /* Lavoro: numero da restituire 
    				      dopo l' elevazione a potenza */
    	
    	/* ciclo di controllo per 
    	   moltiplicare N(potenza) volte il numero 
    	   solo se N e' diverso e maggiore di zero */
    	while(potenza != 0 && potenza-- > 0)
    	{
    		elevato *= numero;
    	}
    	
    	/* fine funzione potenza_interi
    	   ritorno l' elevazione a potenza */
    	return elevato;
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    mmm..
    anche cosi':
    codice:
    long pow(unsigned int base,unsigned int exp)
    {
    //0^0 non esiste
    if (base==exp==0)return -1;
    
    unsigned int res=1;
    
    for(i=1;i<exp;i++)res*=base;
    return res;
    }
    naturalmente devi gestire l'overflow..

    edit:
    non puoi usare unsigned int come valore di ritorno perche' in caso di 0^0 non puoi gestirti il -1

  3. #3
    0 alla 0 non fa 1 ?
    oppure non e' vero che qualunque numero elevato alla zero da 1 ?

    comunque sia hai scritto tutto tranne che ANSI C secondo il prof

    1 solo return per funzione
    la variabili vanno dichiarate a inizio funzione
    l' indentatura e' fondamentale

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Originariamente inviato da andr3a
    0 alla 0 non fa 1 ?
    assolutissimamente no.
    oppure non e' vero che qualunque numero elevato alla zero da 1 ?
    qualunque tranne 0.
    comunque sia hai scritto tutto tranne che ANSI C secondo il prof

    1 solo return per funzione
    la variabili vanno dichiarate a inizio funzione
    l' indentatura e' fondamentale

    ma chi se ne frega,ti ho dato un consiglio..
    poi spetta a te migliorarlo..

  5. #5
    Originariamente inviato da kentaromiura
    assolutissimamente no.

    qualunque tranne 0.
    <?php
    echo ''.pow(0,0);
    ?>

    #include <math.h>
    int main(
    int argc,
    char *argv[]
    )
    {
    printf("Risultato: %f", pow(0.00, 0.00));
    return 0;
    }


    ti scrivo i risultati o le testi da solo ?
    dai , te li scrivo:
    1
    1.0000000


    Originariamente inviato da kentaromiura
    ma chi se ne frega,ti ho dato un consiglio..
    poi spetta a te migliorarlo..
    ok, calma



    [editato]
    ok, potrebbe essere come dici un risultato di convenzione, quella convenzione e' utile anche a me al fine dell' applicativo, se pow mi andava bene, questa funzione mi va bene altrettanto, sara' mia premura, grazie alle tue delucidazioni, spiegare che la funzione non considera appositamente la casistica 0^0 poiche' questa non e' necessaria ai fini dell' applicativo.

    quindi, detto questo, va bene quella che ho scritto ???
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    http://www.linuxquestions.org/questi...003/04/2/53893

    qui spiegano meglio il perche' da' 1, e' stata
    la IEEE 854
    a definire pow(0,0) =1
    ma matematicamente parlando non esiste.


    ad occhio sembra giusta, pero' ti consiglio di calcolare con un long il risultato,
    castare l'unsigned int a long e se i risultati non differiscono
    (cosi' gestisci l'overflow)
    restituire il dato (ti serve comunque long per via del -1)

  7. #7
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Ricorsiva non ti piace? Forse è il modo più naturale per definire le potenze...

    codice:
    int potenza (int base, int esponente) {
            int risultato;
            if (esponente == 0)
                    risultato = 1;
            else
                    risultato = base * potenza (base,esponente-1);
            return risultato;
    }
    Per basi intere unsigned ed esponenti interi unsigned dovrebbe andare bene...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.