Funzione potenza

di il
8 risposte

Funzione potenza

Salve, ho realizzato questo programma dove se utilizzo la funzione potenza da me realizzata il programma funziona correttamente , mentre se la sostituisco con la funzione pow presente nella libreria math.h , la funzione ConvertireStringaInNumero mi restituisce valori diversi?
Ho visto che la funzione pow restituisce un double così ho provato a scrivere
num = num + ((Str[i] - 48) * (int) pow(10, (dim - 1) - k));
ma ottengo ancora una volta risultati diversi.
Come posso risolvere ? Grazie.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define T '-'
#define SFINE '\0'
#define NFINE -1
#define DIM 1000

int TrovaMassimo(int base, char *Str);
int VerificaCorrettezzaNumeri(int base, char Str[]);
void ConvertireStringaInVettoreInteri(char *Str, int V[]);
int LeggereDimensioneNumero(int i, char Str[]);
int ConvertireStringaInNumero(int i, int j, int dim, char Str[]);
int potenza(int base, int esponente);
int RicercaMassimo(int V[]);

int main(void){
	char Str[] = "421-64-5-345";
	int base = 7;
	int max;

	max = TrovaMassimo(base, Str); //restituisce il massimo oppure -1 in caso di simboli non ammessi

	if (max == -1){
		printf("E' presente almeno un simbolo non ammesso dalla base inserita\n");
	}else{
		printf("Il numero e' %d\n",max);
	}

	system("pause");
	return 0;
}

int TrovaMassimo(int base, char *Str){
	int n;
	int V[DIM];
	int esito;
	ConvertireStringaInVettoreInteri(Str, V);
	esito = VerificaCorrettezzaNumeri(base, Str);  // restituisce 0 in caso di esito positivo o altrimenti -1
	if (esito == 0){
		n = RicercaMassimo(V);
	}
	if (esito == -1){
		n = -1;
	}
	return n;
}

int VerificaCorrettezzaNumeri(int base, char Str[]){
	int i = 0;
	int c = 0;

	while (Str[i] != SFINE && c == 0){
		if ((Str[i] - 48) >= base && Str[i] != T && c == 0){
				c = -1;
		}
		i++;
	}
	return c;
}
void ConvertireStringaInVettoreInteri(char Str[], int V[]){
	int i = 0;
	int k = 0;
	int dim, num;

	while(i < strlen(Str)){
		dim = LeggereDimensioneNumero(i, Str);
		num = ConvertireStringaInNumero(i, i + dim - 1, dim, Str);
		V[k] = num;
		i = i + dim + 1;
		k++;
	}

	V[k] = NFINE;
/* oppure:
	int i = 0;
	char *ch = strtok(Str, "-");
	while (ch != NULL){
			V[i] = atoi(ch);
			ch = strtok(NULL, "-");
			i++;
	}

	V[i] = NFINE;

*/
	return;
}

int LeggereDimensioneNumero(int i, char Str[]){
	int cont = 0;
	while (Str[i] != T && Str[i] != SFINE){
		cont++;
		i++;
	}

	return cont;
}

int ConvertireStringaInNumero(int i, int j, int dim, char Str[]){
	int k = 0;
	int num = 0;
	while (i <= j){
		num = num + ((Str[i] - 48) * potenza(10, (dim - 1) - k));  <---------------------------------------------------
		k++;
		i++;
	}

	return num;
}

int potenza(int base, int esponente){
	int i = 1;
	int p = base;

	if (esponente == 0){
		base = 1;
	}
	while (i < esponente){
		base = base * p;
		i++;
	}
	return base;
}


int RicercaMassimo(int V[]){
	int i = 0;
	int max = V[i];

	while (V[i] != NFINE){
		if (max < V[i]){
			max = V[i];
		}
		i++;
	}
	return max;
}

8 Risposte

  • Re: Funzione potenza

    Spiega meglio il problema. Cosa inserisci in input? Cosa hai in output?
  • Re: Funzione potenza

    Guarda che non hai bisogno della potenza per fare la conversione:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    long converti(const char *str){
        long ret = 0;    
        int segno = 1;
        if(*str == '-'){
            segno = -1;
            str++;
        } 
        while(*str >= '0' && *str <= '9'){
            ret *= 10;
            ret += *str - '0';
            str++;
        }
        if (segno < 0)
            return -ret;
        else
            return ret;
    }
    
    int main(void){
        char numero[] = "-123456789";
        printf("%ld", converti(numero));
        return 0;
    }
    
    Comunque per quanto riguarda il pow, di principio non va usato se i calcoli non sono a virgola mobile
  • Re: Funzione potenza

    La funzione potenza ha gli stessi input che richiede la funzione pow ovvero la base e l'esponente, l 'output é la potenza.
    Ho provato a stampare la funzione pow con il formato %f e ho notato che mi restituisce valori corretti, mentre la variabile num al momento della somma assume valori sbagliati.
    Grazie weierstrass, come faccio a capire se i calcoli che sto facendo sono in virgola mobile?
  • Re: Funzione potenza

    Se la base è un intero e l'esponente è un intero positivo, matematicamente il risultato è un intero. Non devi usare float o i double a meno che non sei costretto, tipo che devi calcolare 10^20 (anche in quel caso comunque esistono delle librerie apposite per i numeri grandi), altrimenti rischi di perdere precisione
  • Re: Funzione potenza

    Mi associo che non serve usare le potenze per la conversione, ma comunque la domanda che hai fatto merita una risposta.
    Ho provato la tua funzione ConvertireStringaInNumero, con 5 o 6 stringhe diverse in ingresso, e non ho differenze se uso pow o potenza.
    Se usi numeri che superano la capacità del signed int, avrai delle discrepanze, ho usato _int64 per convertire il double di pow, ma per numeri ancora più grandi vanno usati tipi appropriati anche nelle funzioni e su printf.

    Edit : modifica per interi a 64bit

    per provare ho usato il codice seguente:
    
    // convertire caratteri in numero
    //
    
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    
    int64_t converti(const char *str) {
    	int64_t ret = 0;
    	int segno = 1;
    	if (*str == '-') {
    		segno = -1;
    		str++;
    	}
    	while (*str >= '0' && *str <= '9') {
    		ret *= 10;
    		ret += *str - '0';
    		str++;
    	}
    	if (segno < 0)
    		return -ret;
    	else
    		return ret;
    }
    
    int64_t potenza(int64_t base, int esponente) {
    	int i = 1;
    	int64_t p = base;
    
    	if (esponente == 0) {
    		base = 1;
    	}
    	while (i < esponente) {
    		base = base * p;
    		i++;
    	}
    	return base;
    }
    
    int64_t ConvertireStringaInNumero(int i, int j, int dim, char Str[]) {
    	int k = 0;
    	int64_t num = 0;
    	while (i <= j) {
    		num = num + ((Str[i] - 48) * potenza(10, (dim - 1) - k)); //< -------------------------------------------------- -
    			k++;
    		i++;
    	}
    	return num;
    }
    
    int64_t ConvertireStringaInNumeroPow(int i, int j, int dim, char Str[]) {
    	int k = 0;
    	int64_t num = 0;
    	while (i <= j) {
    		num = num + ((Str[i] - 48) * (int64_t)pow(10, (dim - 1) - k)); //< -------------------------------------------------- -
    		k++;
    		i++;
    	}
    	return num;
    }
     
    int main(void) {
    	                
    	char cNumero[] = "8907643223455666734";
    	
    	int i = 0;
    	int j = sizeof(cNumero) - 2;
    	int dim = sizeof(cNumero) -  1;
    
    	printf("con pow %lld\n", ConvertireStringaInNumeroPow(i, j, dim, cNumero));
    	printf("con potenza %lld\n", ConvertireStringaInNumero(i, j, dim, cNumero));
    	printf("con converti %lld", converti(cNumero));
    	
    	return 0;
    }
    
  • Re: Funzione potenza

    Il tipo è int64_t e devi mettere #include <inttypes.h>

    __int64 non è standard
  • Re: Funzione potenza

    Weierstrass ha scritto:


    Il tipo è int64_t e devi mettere #include <inttypes.h>

    __int64 non è standard
    scusate ho modificato l'esempio.
  • Re: Funzione potenza

    Weierstrass ha scritto:


    Il tipo è int64_t e devi mettere #include <inttypes.h>
    Io ho sempre utilizzato <stdint.h>/<cstdint> ed effettivamente la documentazione di <cinttypes> dice
    Including this header automatically includes also <cstdint>
Devi accedere o registrarti per scrivere nel forum
8 risposte