Funzione pow() math.h

di il
12 risposte

Funzione pow() math.h

Ragazzi scusate la domande praticamente super-idiota, ma sarà che il mio cervello è in pappa e non riesco a risolvere questo problema:
#include<iostream>
#include<math.h>

int main(){
    int esp=1;
    std::cout<<"pow: 23^"<<esp<<" = "<<(int)pow(23, esp)<<"    ";
    std::cout<<"pow: 23^"<<esp<<" = "<<(int)pow(23, 1)<<"    ";
    return 0;
}
Perchè la prima riga mi stampa 22 e la seconda 23 nonostante siano identiche?
PS: se levo (int) mi stampano entrambi 23, quindi davvero non riesco a capire dove sia il problema.

12 Risposte

  • Re: Funzione pow() math.h

    Cambia compilatore ... (lascia perdere DevC++ e il suo compilatore ...)
  • Re: Funzione pow() math.h

    Nonostante Dev-C++ sia certamente obsoleto, stavolta credo che non sia lui il colpevole. E lo dico perché ho provato il codice su Code::Blocks ed effettivamente la prima riga stampa 22.

    Potrebbe essere per questo motivo: all'interno del calcolatore possono esserci "errori" dovuti ad approssimazione, soprattutto con i valori floating point (cioè con la virgola). Quando poi fai il casting verso il tipo int introduci un troncamento, per cui è possibile che un valore 22.9999999 venga troncato al valore intero e diventi così 22.

    Almeno questa è la mia ipotesi. Sentiamo cosa ne dicono gli altri utenti...
  • Re: Funzione pow() math.h

    Visual C++ restituisce i valori corretti
  • Re: Funzione pow() math.h

    Provato su Linux con compilatore g++ ed entrambi i risultati sono corretti, cioè 23.
    Invece su Code::Blocks, con compilatore mingw32-g++, il primo risultato è 22, come dicevo prima.

    Curioso...
  • Re: Funzione pow() math.h

    Infatti io uso Code::Block con conpilatore mingw32g++. Che poi, questo compilatore non é basato proprio sul gcc di Linux?
    Bhe, detto questo devo compilarlo in ambiente Linux per farlo partire dunque?
  • Re: Funzione pow() math.h

    E' un port di gcc ma evidentemente (almeno nelle librerie matematiche) non è un gran che ...

    Quindi, usa un altro compilatore (cosa che puoi impostare con il CodeBlocks)
  • Re: Funzione pow() math.h

    Provato col cast esplicito?
    (23.0,1.0)
    Anche con la variabile
  • Re: Funzione pow() math.h

    Sì ... non va ...

    il problema sembra essere nella conversione del risultato in (int)
  • Re: Funzione pow() math.h

    Si viene troncato,non è realmente un bug, anche se....
    Basta mettere un +0.5 per la maggior parte dei casi andrà bene.
  • Re: Funzione pow() math.h

    Non puoi mettere semplicemente +0,5, in quanto poi altereresti il risultato esatto che ottieni se al posto di 23 ci metti 2 o 3 xD
  • Re: Funzione pow() math.h

    Devi sommare 0.5 al risultato e poi eseguire il cast a int.
    Dato che la conversione a int tronca il numero dopo la virgola con la somma avrai il corretto risultato arrotondato.

    Es 2.3 + 0.5 = 2.8 = 2
    2.7 + 0.5 = 3.2 = 3
    Etc etc eyc....
  • Re: Funzione pow() math.h

    Sisi, avevo capito quello che intendevi rileggendo meglio, pardon!
Devi accedere o registrarti per scrivere nel forum
12 risposte