Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C/C++] warning con round() (nonostante math.h)

    Problema del tutto analogo a quello esposto qui
    Scrivo codice in C, utilizzando round() su variabili double. Compilo sotto Windows con DevC++ e nessun problema. Compilo sotto linux con gcc version 3.4.6, con le opzioni gcc -lm -Wall, includendo math.h (#include <math.h>), e il risultato e':
    codice:
    warning: implicit declaration of function `round'
    Allora faccio un altro tentativo: rinomino il file con estensione .cc e compilo con g++ (anche lui e' gcc version 3.4.6), sempre con le opzioni g++ -lm -Wall e ottengo:
    codice:
     warning: converting to `int' from `double'
    ... dal momento che ho gia' avuto diversi problemi legati all'arrotondamento (qui ), me ne frego di questi warning oppure mi devo preoccupare?

  2. #2

    Re: [C/C++] warning con round() (nonostante math.h)

    Originariamente inviato da gulpgiulia me ne frego di questi warning oppure mi devo preoccupare?
    Ignorare i warning è il metodo migliore per produrre velocemente codice che non funziona.

    Se posti il codice, magari si può capire perché ti genera quel warning, e magari come evitarlo.

  3. #3
    ... in prima approssimazione ignoro sempre i warning... ma in questo caso devo essere sicura che i risultati dei calcoli eseguiti siano quellli attesi, senza brutte sorprese dovute ad errori di troncamento.
    Per quanto riguarda il codice, ecco un esempio concreto:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    int    nbinR;
    double Rmin,Rmax,rstep;
    int main()
      {
         Rmin=0.0;
         Rmax=20.0;
         rstep=0.2;
         nbinR=round((Rmax-Rmin)/rstep);
         return 0;
      }
    Compilando con gcc -lm -Wall si ottiene: warning: implicit declaration of function `round'

  4. #4
    La libreria math.h contiene esattamente queste funzioni math.h e come vedi non possiede la round().
    La curiosità è la fonte della conoscenza.

  5. #5
    Ho fatto riferimento alla math.h perche' cosi' era stato suggerito nelle risposte al thread che ho segnalato (vedi). Il riferimento che mi hai indicato, in effetti, non lascia dubbi sull'assenza della round() in math.h, ma informa dell'esistenza, nella categoria "Rounding functions", delle funzioni ceil (round up, cioe' per eccesso) e floor (round down, cioe' per difetto). Il punto e' che io ho bisogno della funzione che fa l'arrotondamento "giusto", cioe', ad esempio, arrotonda 1.2 a 1 e 1.9 a 2. Possibile che non esista niente che fa esattamente questo, e quindi l'unica opzione e' considerare la parte intera del numero e scrivere un if, del tipo:
    codice:
      double x;
      double fractx,intx;
      int roundx;
      fractx=modf(x,&intx);
      if((x-intx)>0.5)
    	roundx=ceil(x);
      else
    	roundx=floor(x);
    Del resto, l'utilizzo di round() mi era stato suggerito in questo stesso forum (qui) e la sua applicazione non ha dato problemi finche' ho compilato con DevC++. Inoltre, compilare sotto linux con gcc da solo un warning, quindi qualcosa deve esistere che risponde alla chiamta di round() del compilatore...

  6. #6
    Penso dipenda dalla versione di gcc o da differenti versioni di math.h.
    Nel mio "i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)" in math.h sono presenti:
    Codice PHP:
        double
         round
    (double x);

         
    long double
         roundl
    (long double x);

         
    float
         roundf
    (float x);

         
    long int
         lround
    (double x);

         
    long int
         lroundl
    (long double x);

         
    long int
         lroundf
    (float x);

         
    long long int
         llround
    (double x);

         
    long long int
         llroundl
    (long double x);

         
    long long int
         llroundf
    (float x);
    ...
    STANDARDS
         The round
    () , lround() , and llround() functions conform to ISO/IEC
         9899
    :1999(E). 
    Per evitare il warning nell'assegnamento del double a int prova ad applicare un'operazione di cast esplicita:
    Codice PHP:
    int aInt static_cast <int> (round (2.51)); 

  7. #7
    Facendo riferimento all'ultimo intervento di MacApp:
    1) si ripropone l'annosa questione. Il problema dell'arrotondamento e' troppo compilatore-depending... possibile che non ci sia una soluzione "safe" per l'implementazione di una funzione cosi' concettualmente semplice come l'arrotondamento "giusto" (a seconda dei casi, round up o round down) all'intero piu' vicino?
    2) come faccio a capire qual e' il contenuto della math.h che includo io? Se leggo il file /usr/include/math.h non trovo niente che somigli nemmeno lontanamente a quanto postato da MacApp
    3) prima di conoscere l'esistenza della funzione round(), avevo gia' provato ad affrontare il problema con il cast esplicito, ma il risultato ottenuto non era affatto univoco...

  8. #8
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Nella doc della funzione dovrebbe essere esplicitamente indicata la modalita' con la quale viene effettuato l'arrotondamento.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da gulpgiulia
    Facendo riferimento all'ultimo intervento di MacApp:
    1) si ripropone l'annosa questione. Il problema dell'arrotondamento e' troppo compilatore-depending... possibile che non ci sia una soluzione "safe" per l'implementazione di una funzione cosi' concettualmente semplice come l'arrotondamento "giusto" (a seconda dei casi, round up o round down) all'intero piu' vicino?
    Il problema non è se è troppo dipendente dal compilatore, ma quanto sia dipendente dall'operatore.
    Se ci pensi bene, gli arrotondamenti vengono sempre fatti indicando a quale decimale si intende effettuare l'operazione.

    Es.
    10.356367

    a quale cifra lo arrotonderesti?
    Un metodo che userei io è fissare il risultato con una sprintf() e opererei sulla stringa per crearmi una mia round personalizzata. (Che ovviamente indichi a quale cifra operare l'arrotondamento)

  10. #10
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Per sapere come viene effettuato l'arrotondamento occorre sapere anche la precisione della macchina utilizzata, che nei calcolatori moderni dovrebbe essere sempre la stessa.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.