IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

la fonction fabs


Sujet :

Bibliothèque standard C

  1. #1
    Invité
    Invité(e)
    Par défaut la fonction fabs
    bonjour
    j'ai des difficultés à faire fonctionner fabs pour avoir la valeur absolue d'un double
    j'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <math.h>
    (...)
    double aar1, aar2, ear1, ear2;
    (...)
    ear1 = fabs(car - aar1);
    ear2 = fabs(car - aar2);
    (...)
    if (ear1<ear2)
         height = height +16;
    seul souci : j'ai l'impression que le fabs n'est pas pris en compte.

    j'ai aussi essayé avec ceci (pour déclarer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double fabs (double (car-aar1), (car-aar2);
    en déclaration mais ça ne marche pas

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    En C :
    - fabs => double
    - fabsf => float

    En C++ : fabs tout le temps.

    Quel est le type de car, que tu as inclus dans tes appels à fabs ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Invité
    Invité(e)
    Par défaut
    le style est pourtant bien un double
    je ne comprend pas

    n'y-a-t-il pas une autre fonction standard qui fait pareil que la valeur absolue ?

  4. #4
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Que veut-tu dire par "qui fait pareil" ?
    Une valeur absolue reste une valeur absolue ^^

    Au vu des conversions implicites ton code n'a rien d'incorrect, il nous faudrait plus d'informations

    La fonction fabs ne prenant qu'un seul paramètre, ton dernier essai est incorrect
    Plus tu pédales moins fort, moins t'avances plus vite.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    le style est pourtant bien un double
    je ne comprend pas

    n'y-a-t-il pas une autre fonction standard qui fait pareil que la valeur absolue ?
    Réponds aux questions posées aussi, stp... Le type de ta variable car, c'est quoi ?

    Également : as-tu une erreur à la compilation, ou à l'exécution ? Si c'est à l'exécution, avec quelles valeurs pour car, aar1/2 et ear1/2 ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Réponds aux questions posées aussi, stp... Le type de ta variable car, c'est quoi ?
    Il me semble pourtant avoir déjà dit que c'était un double
    pas d'erreur à la compilation, mais j'ai remarqué que le height ne diminuait que lorsque le width lui était égal
    Dernière modification par Invité ; 15/12/2009 à 10h26.

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    Il me semble pourtant t'avoir dit que c'était un double
    C'est surtout que la phrase "le style est pourtant bien un double" ne m'aide pas franchement : je n'ai pas ton code, et associer la variable "car" à un style n'est pas franchement évident.

    Citation Envoyé par gizmo27 Voir le message
    pas d'erreur à la compilation, mais j'ai remarqué que le height ne diminuait que lorsque le width lui était égal
    Là encore, le nommage de tes variables n'aide vraiment pas à savoir ce qu'il se passe. Très vraisemblablement, ton test est toujours faux ou vrai (=> pas de de modifications de height, ou modification systématique au contraire).
    Effectue une trace, et donne les valeurs des différentes variables impliquées en expliquant aussi ce que tu comptais faire à l'origine. Ne nous explique pas tes lignes de code, dis-nous ce que tu souhaitais faire qui t'a conduit à les écrire (le besoin initial, si tu préfères).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Invité
    Invité(e)
    Par défaut
    ok ça fait partie de mon projet de calcul bpf
    en fait en sélectionnant un aspect ratio (=AR) personnalisé il en déduit d'abord le height (ça c'est réglé), mais surtout en bougeant le contrôle updown il augmente ou diminue la résolution
    voici une partie du programme se trouvant dans une fonction CALLBACK je crois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
    {    	
    	NMHDR *pnmhdr=(LPNMHDR)lParam;
    	double aar1, aar2, ae1, ae2;	
     
        switch (message)
        {
            case WM_CREATE:
                RemplieFenetrePrincipale(fenetrePrincipale);			
                return 0;
            case WM_COMMAND:
                NotificationControle(fenetrePrincipale,message,wParam,lParam);			
    			return 0;
    		case WM_NOTIFY:			
    			if ((pnmhdr->hwndFrom)==hupdown)
    				{
    				if(pnmhdr->code==UDN_DELTAPOS)
    					{
    					NM_UPDOWN *pnmupdown=(LPNMUPDOWN)lParam;
    					if(pnmupdown->iDelta<0)
    						{						
    						bool_2=IsDlgButtonChecked(fenetrePrincipale, ID_CHECKBOX);
    						bool_4=IsDlgButtonChecked(fenetrePrincipale, ID_RADIOBUTTON_21);
    						bool_5=IsDlgButtonChecked(fenetrePrincipale, ID_RADIOBUTTON_22);
    						if (bool_4 == 1) // 16:9
    							{
    							if (bool_2 == 1) // 16:9 mod 16
    								{
    								if (width<720 && i>0)
    									{
    									width = width + 16;
    									i=i-1;
    									height=tableau1_mod16[i];
    									}
    								}				
    							else // 16:9 mod 1
    								{
    								if (width<720 && i>0)
    									{
    									width = width + 1;
    									i=i-1;
    									height=tableau2_mod1[i];
    									}
    								}
    							}
    						else if (bool_5 == 1) // 4:3
    							{
    							if (bool_2 == 1) // 4:3 mod 16
    								{
    								if (width<720 && i>0)
    									{
    									width = width + 16;
    									i=i-1;
    									height=tableau3_mod16[i];
    									}
    								}				
    							else // 4:3 mod 1
    								{
    								if (width<720 && i>0)
    									{
    									width = width + 1;
    									i=i-1;
    									height=tableau4_mod1[i];
    									}
    								}
    							}						
    						else if ((bool_4 == 0) && (bool_5 == 0)) // AR personnalisé
    							{
    							if (bool_2 == 1) // mod 16
    								{
    								if (width<720 && height<hmax)
    									{
    									width = width + 16;
    									aar1 = width/height;
    									ae1 = fabs(car - aar1); // erreur aspect ratio 1 (valeur absolue)									
    									aar2 = width/(height+16);
    									ae2 = fabs(car - aar2); // erreur aspect ratio 2 (valeur absolue)
    									if (ae1>ae2) // compare les 2 EA : garde la plus petite en effet : on cherche à garder l'AR le plus proche de celui choisi par l'utilisateur
    										height = height + 16; // ajuste la résolution en fonction								
    									}
    								}
    							else // mod 1
    								{
    								if (width<720 && height<hmax)
    									{
    									width = width + 1;
    									aar1 = width/height;
    									ae1 = fabs(car - aar1); // erreur aspect ratio 1 (valeur absolue)									
    									aar2 = width/(height+1);
    									ae2 = fabs(car - aar2); // erreur aspect ratio 2 (valeur absolue)
    									if (ae1>ae2) // compare les 2 EA : garde la plus petite en effet : on cherche à garder l'AR le plus proche de celui choisi par l'utilisateur
    										height = height + 1; // ajuste la résolution en fonction
    									}
    								}
    							}
    						}
    					else if(pnmupdown->iDelta>0)					
    						{						
    						bool_2=IsDlgButtonChecked(fenetrePrincipale, ID_CHECKBOX);			
    						bool_4=IsDlgButtonChecked(fenetrePrincipale, ID_RADIOBUTTON_21);
    						bool_5=IsDlgButtonChecked(fenetrePrincipale, ID_RADIOBUTTON_22);
    						if (bool_4 == 1) // 16:9
    							{
    							if (bool_2 == 1) // 16:9 mod 16
    								{
    								if (width>16 && i<44)
    									{
    									width = width - 16;
    									i=i+1;
    									height=tableau1_mod16[i];
    									}
    								}				
    							else // 16:9 mod 1
    								{
    								if (width>16 && i<691)
    									{
    									width = width - 1;
    									i=i+1;
    									height=tableau2_mod1[i];
    									}
    								}
    							}
    						else if (bool_5 == 1)// 4:3
    							{
    							if (bool_2 == 1) // 4:3 mod 16
    								{
    								if (width>16 && i<44)
    									{
    									width = width - 16;
    									i=i+1;
    									height=tableau3_mod16[i];
    									}
    								}				
    							else // 4:3 mod 1
    								{
    								if (width>16 && i<696)
    									{
    									width = width - 1;
    									i=i+1;
    									height=tableau4_mod1[i];
    									}
    								}
    							}						
    						else if ((bool_4 == 0) && (bool_5 == 0)) // AR personnalisé
    							{
    							if (bool_2 == 1) // mod 16							
    								{
    								if (width>16 && height>16)
    									{
    									width = width - 16;
    									aar1 = width/height;
    									ae1 = fabs(car - aar1); // erreur aspect ratio 1 (valeur absolue)
    									aar2 = width/(height-16);
    									ae2 = fabs(car - aar2); // erreur aspect ratio 2 (valeur absolue)
    									if (ae1>ae2) // compare les 2 EA : garde la plus petite en effet : on cherche à garder l'AR le plus proche de celui choisi par l'utilisateur
    										height = height - 16; // ajuste la résolution en fonction									
    									}
    								}
    							else // mod 1
    								{
    								if (width>16 && height>16)
    									{
    									width = width - 1;
    									aar1 = width/height;
    									ae1 = fabs(car - aar1); // erreur aspect ratio 1 (valeur absolue)
    									aar2 = width/(height-1);
    									ae2 = fabs(car - aar2); // erreur aspect ratio 2 (valeur absolue)
    									if (ae1>ae2) // compare les 2 EA : garde la plus petite en effet : on cherche à garder l'AR le plus proche de celui choisi par l'utilisateur
    										height = height - 1; // ajuste la résolution en fonction
    									}
    								}
    							}					
    						}						
    					}
    				}			
    			sprintf(bufw, "%d", width);
    			SendDlgItemMessage(fenetrePrincipale,ID_EDITBOX_3,WM_SETTEXT,0,(LPARAM)bufw);
    			sprintf(bufh, "%d", height);			
    			SendDlgItemMessage(fenetrePrincipale,ID_EDITBOX_4,WM_SETTEXT,0,(LPARAM)bufh);
    			calculaffichresbpf(fenetrePrincipale);			
    			return 0;		
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
    	    default:
                return DefWindowProc(fenetrePrincipale,message,wParam,lParam);
        }
    }
    comme je l'ai expliqué dans les commentaires (voir code), on choisit une résolution toujours de telle sorte que l'AR recalculé (width/height) (aar1 ou aar2) se rapproche toujours de l'AR choisi par l'utilisateur (car)

    cela est calculé par erreurs aspect : exemple : pour une résol de 720 x 416 au départ : quand on clique sur la flèche du bas : il calcule des résol 704 x 416 ou 704 x 400 laquelle donne un AR le plus proche de l'AR utilisateur : pour cela il calcule 2 erreur 'aspect' et les compare : la plus petite l'emporte

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    OK, je vois un peu... Tu as effectué une trace de ton code, éventuellement en debug, pour voir par où il passait et avec quelles valeurs ? Parce que là, soit tu as une variable globale nommée "i" (ce qui serait... courageux, on va dire ), soit il manque des bouts.

    Vu le contexte, ça va être chaud pour t'aider sans les traces (= les valeurs de chaque variable) pendant l'exécution... Je pencherais pour un problème de formules plus que de précision, bien que cette dernière possibilité reste toujours une épée de Damoclès lors des comparaisons de flottants...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #10
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Déjà, met plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aar[1,2] = ((double)width)/height
    Sinon ton opération ne sera convertie que pour l'opérateur =.

    Ensuite, je ne pense pas qu'il y ait un problème de précision (15 digit sur les double quand même).
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  11. #11
    Invité
    Invité(e)
    Par défaut
    et pourtant j'ai vu et revu le code en long en large et en travers
    ça DOIT marcher

    PS : je me suis amusé à afficher aar1 et aar2 correspondant : dans les 2 cas il affiche 1
    je n'y comprend rien à rien
    Dernière modification par Invité ; 15/12/2009 à 14h34.

  12. #12
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Est-ce que tu as pris en compte la remarque de Lavock ?
    La division de 2 entiers donnera un entier, il faut donc forcer le type avec un cast (double).
    5/2 donnera 2 et restera un type entier.
    Si tu fais un cast : (double) 5 / 2 donnera 2.5 en double
    Dans ce dernier cas tu forces le type de 5 à double et au vu des conversions implicites 2 sera converti aussi
    Plus tu pédales moins fort, moins t'avances plus vite.

  13. #13
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pour renforcer cette remarque, cette écriture est équivalente à :
    C'est-à-dire à 5.0 / 2 ce qui donne effectivement 2.5 et non à :
    Ce qui donnerait (double) (2) soit 2.0.
    Attention à l'ordre des priorité ... lorsqu'on n'est pas sûr de soi, utiliser les parenthèses.

  14. #14
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Donc mes parenthèses étaient belle est bien superflux ><...

    Règle global : dans le cas d'un opérateur binaire, les opérandes sont implicitement convertit à la plus grande précision. Dans le cas d'opération complexe, cela ce fait par ordre de priorité des opérateurs. C'est souvent la source de résultat étrange >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  15. #15
    Invité
    Invité(e)
    Par défaut
    oui c'est exactement ça
    c'était vraiment tout bête
    dire que j'ai buté tout ce temps (presque 2 jours) pour ce tout petit détail

    merci à vous

    PS : je ne savais pas que dans la logique informatique un int divisé par un autre int donnait un int
    est-ce aussi le cas pour le c# ?
    Dernière modification par Invité ; 15/12/2009 à 18h48.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo