[C] Valore assoluto: alternativa a fabs

di il
8 risposte

[C] Valore assoluto: alternativa a fabs

Buongiorno, vi scrivo per un dubbio che ho avuto scrivendo un programma. Mi serve calcolare il modulo di una differenza: in particolare dati due numeri, tra i quali non è noto quale sia il maggiore o il minore, mi serve la 'distanza' che li separa. Inizialmente ho usato fabs() della libreria math.h, poi ho pensato di provare a sfruttare le conversioni di tipo del C, ma non ho avuto l'esito sperato.

diff_count+=(unsigned)(right_count-left_count);
Qualcuno sa spiegarmi perchè non funziona? Sapete suggerirmi qualche alternativa a fabs per il mio scopo?

Grazie.

8 Risposte

  • Re: [C] Valore assoluto: alternativa a fabs

    Non si è capito molto ...

    Di che tipo sono quelle variabili? Che c'entra la conversione di tipo per ottenere il valore assoluto?
  • Re: [C] Valore assoluto: alternativa a fabs

    Tutte le variabili sono di tipo int, io avevo pensato di poter 'troncare' il segno derivante da quell'operazione e assegnare il numero così ottenuto a diff_curr.
  • Re: [C] Valore assoluto: alternativa a fabs

    No ... non va bene ... devi correggere il segno.
    
    int mod = right_count-left_count;
    mod = mod<0 ? -mod : mod;
    diff_count += mod;
    
  • Re: [C] Valore assoluto: alternativa a fabs

    Si infatti questo è uno dei modi, volendo fare tutto su una riga andrebbe bene anche fabs, però mi incuriosiva capire cosa fa il C quando gli si chiede di convertire un int negativo in un unsigned...
  • Re: [C] Valore assoluto: alternativa a fabs

    Quindi lo conoscevi? E perché chiedi?

    In ogni caso, non importa se una sola linea o meno, il sorgente viene compilato.

    Il cast non "converte" ma "interpreta" diversamente il valore. Il valore non cambia.
  • Re: [C] Valore assoluto: alternativa a fabs

    riccardozack ha scritto:


    Si infatti questo è uno dei modi, volendo fare tutto su una riga andrebbe bene anche fabs, però mi incuriosiva capire cosa fa il C quando gli si chiede di convertire un int negativo in un unsigned...
    Se non li hai studiati cerca "Modulo e Segno" e "Complemento a 2" su siti universitari, e leggi il secondo capitolo più l'appendice B de "The C programming language 2nd Edition" di Kernighan & Ritchie. Se poi ti interessa l'hardware per il complemento studia i sommatori/sottrattori.
  • Re: [C] Valore assoluto: alternativa a fabs

    Quindi lo conoscevi? E perché chiedi?

    In ogni caso, non importa se una sola linea o meno, il sorgente viene compilato.
    Chiedevo per sapere se c'era qualche maniera 'furba' per fare quell'operazione e perchè non funziona il cast con unsigned. Riguardo al fatto di una sola linea, mi serve per leggibilità visto che fa parte di un codice più lungo, anche se potrei usare una macro per sintetizzare l'operazione.
    Se non li hai studiati cerca "Modulo e Segno" e "Complemento a 2" su siti universitari, e leggi il secondo capitolo più l'appendice B de "The C programming language 2nd Edition" di Kernighan & Ritchie.
    Ho studiato le rappresentazioni ma, ad esempio, se usiamo un cast (in questo caso implicito) quando assegniamo ad un int il contenuto di un float otteniamo che la parte decimale viene troncata, ma il cast funziona nonostante la rappresentazione degli int sia molto diversa da quella floating-point dei float. In un certo senso gli int e gli unsigned hanno rappresentazioni più 'vicine'.
  • Re: [C] Valore assoluto: alternativa a fabs

    La leggibilità diminuisce se usi una sola riga.

    Il cast modifica la precisione non il segno
Devi accedere o registrarti per scrivere nel forum
8 risposte