fr  en
Hypo-thèses

Bienvenue, vous n'êtes pas connecté. ( Se connecter - S'enregistrer )

Hypo-thèses > Forum > Parlons sciences ! > Informatique > (re) création de fonctions mathématiques en C

RSS >  (re) création de fonctions mathématiques en C
Guillawme #16 16/06/2007 - 20h44
  •   Up
Modérateur

Hors ligne


Biologie

mais c'est peut-être pas grave de pas pouvoir envoyer des nombres très grands vu que ces fonctions sont périodiques

par exemple tu pourrais traiter un nombre trop grand pour être un float en le divisant pour qu'il donne un paramètre plus petit (qui du coup est un float) mais qui donne toujours le même sinus et le même cosinus (un qui soit égal au nombre trop grand à k.2π près, c'est ça ?)

je ne sais pas si c'est faisable ni si c'est facile, c'est juste une suggestion
La science nous donne un moyen de parler de ce que nous ignorons. Cuénot (1866 - 1951)
General Vans #17 17/06/2007 - 00h44
  •   Up
Codeur

Hors ligne Courriel


Mathématiques

Un float est suffisamment grand tu ne devrais pas avoir trop de problème avec.

De toute façon la fonction est faite ainsi
:inn:

Hum... maths ou chimie... mon cœur balance !
11TLP #18 17/06/2007 - 20h38
  •   Up
Hors ligne Courriel


Mathématiques

j'ai fait les tests avec des nombres situés entre 0 et 2π mais, je vais essayer avec float

edit : ça ne marche plus, j'ai dû modifier presque tout mon code à cause du changement double -> float mais ça m'affiche toujours une console vide  : b l i n k :
Ce message a été édité par 11TLP le 18/06/2007 à 20h11.
Kabefis #19 26/06/2007 - 19h16
  •   Up
Hors ligne Courriel


Ah tu utilise les fonction de math.h ! Je croyez que tu t'étais lancé dans une reconstruction de cette fonction.


(si c'est toujours d'actualité :p)

.Tu définis une variable de type float(ou double) genre monResultat : )
tu fait monResultat=sin(monAngle);
monAngle pouvant être un int,float etc, la fonction convertira.

.Et pour l'afficher, surement là ou tu avait ton problème:
printf("\nSin(%.2f) = %.2f\n",monAngle,monResultat);


%.2f  >> le f correspond à un nombre à virgule (float) si tu met %i ca t'affiche un entier.Le ".2" sert à seulement mêtre 2 chiffres après la virgule, peut aussi faire du %3i l'affiche de 2 sera 002, ou encore %4.3f l'affichage de 20.7 sera  0020.700, je sais plus si en faisant %.f ca gère tout seul les zeros inutiles.

Si c'est toujours pas ca .. bah :/ j'peux pas aider plus sans le source ni rapport de quelquonques erreurs/warnings.

A+
Erreurs sur erreurs la vie évolue, l'humanité est une des plus grandes sources d'erreurs.
11TLP #20 27/06/2007 - 00h10
  •   Up
Hors ligne Courriel


Mathématiques

j'essayais de recréer et je mettais %f dans le printf et après ça m'affichait des zéros après la virgule

pour le code source j'ai la flemme mais dès que possible je vous en ferai part ( il faut que j'allume l'ordinateur, qu'il ne plante pas, que j'exécute Dev-C++, que ça ne plante pas, que j'ouvre mon projet, que je recopie le code sur ma clé USB sans faire planter mon ordinateur ( ou sans qu'il écrive incorrectement les données ) et que je revienne vous le montrer )
Ce message a été édité par 11TLP le 27/06/2007 à 00h14.
Kabefis #21 30/06/2007 - 15h01
  •   Up
Hors ligne Courriel


Avec un ordinateur comme ca c'est peut etre normal qu'il veuille pas te donner le résultat d'un sinus XD
Erreurs sur erreurs la vie évolue, l'humanité est une des plus grandes sources d'erreurs.
General Vans #22 30/06/2007 - 15h39
  •   Up
Codeur

Hors ligne Courriel


Mathématiques

Comment un ordinateur retourne t'il un sinus en fait ? Quel est le contenu de la fonction ?
:inn:

Hum... maths ou chimie... mon cœur balance !
Kabefis #23 02/07/2007 - 22h01
  •   Up
Hors ligne Courriel


Approximation, non?
Y a une formule avec des factoriels, c'est une somme de termes, et avec une bonne dizaine de terme ca doit être déjà pas mal. (j'dit ca j'dit rien : ) )
Erreurs sur erreurs la vie évolue, l'humanité est une des plus grandes sources d'erreurs.
11TLP #24 03/07/2007 - 14h14
  •   Up
Hors ligne Courriel


Mathématiques

c'est avec la formule sur le sujet sur le sinus\cosinus sur le forum de mathématiques, je fais une boucle sur n au moins 60 fois mais je ne peux aller que jusqu'à 24 si j'utilise des float
11TLP #25 21/07/2007 - 18h11
  •   Up
Hors ligne Courriel


Mathématiques

bon alors voilà le code que vous attendez tous !!!

il est composé de 5 fichiers, au cas où je réutilise mes fonctions ailleurs :

main.c

#include <stdio.h>
#include <stdlib.h>
#include "sinus.h"

int main(int argc, char *argv[])
{
  float x = 3.14;               //là, je teste la fonction avec une certaine valeur
  printf("%lf\n" , sinus(x));   // ( elle peut changer en faisant plusieurs tests )
  system("PAUSE" );
  return 0;
}


sinus.h

#ifndef SINUS


#define SINUS


#include "math2.h"


float sinus(float);
float cosinus(float);

#endif


sinus.c


#define PRECISIONSIN 60  // c'est la précision du calcul, là elle est à 60 mais avec des float elle doit être plus petite


sinus(float nmb)
{
       int i ;
       float a = 0;
       for(i = 0 ; i < PRECISIONSIN ; i++ )
       {
             a += ( puissance(-1,i) * ( puissance(nmb,2 * i + 1) / factorielle(2 * i + 1)));
       }
      
       return a;
}


cosinus(float nmb)
{
       int i;
       float a = 0;
       for(i = 0 ; i < PRECISIONSIN ; i++ )
       {
             a += ( puissance(-1,i) * ( puissance(nmb,2 * i) / factorielle(2 * i)));
       }
      
       return a;
}


math2.h

#ifndef MATHDEUX


#define MATHDEUX    // pourquoi mathdeux ? parce-que math.h et math.c existent déjà


float puissance(float,int);
float factorielle(int);

#endif


math2.c



puissance(float nombre,int exposant)
{
           float b = 1 ;
           int j ;
           for( j = 1 ; j <= exposant ; j++ )
           {
                b *= nombre ;
           }
           return b ;
}


factorielle(int nombre)
{
           float f = 1 ;
           if(nombre == 0 )   // à la demande de Révox, la fonction prend en compte 0!
           { f = 1; }
          
           else
           {
           int k ;
           for( k = 1 ; k <= nombre ; k++ )
           {
                f *= k;
           }
           }
           return f;
}


il doit y avoir des erreurs étant donné que j'ai modifié des trucs à cause du changement double->float
Kabefis #26 22/07/2007 - 18h32
  •   Up
Hors ligne Courriel


J'ai pas réussi à resoudre ce problème ..
Mais quand tu écrit tes fonctions dans le C il faut réécrire quel type elles renvoient, il le manque justement dans les 4 fonctions.
Sous VisualStudio ou CodeBlock j'ai pas non plus les mêmes problèmes :/
CodeBlocks changent les variables nombres et exposants, ce qui fait une boucle presque infinie avec un exposant d'environ 2 millions (comme mes 2Go de ram :p)
VisualStudio arrive à calculer mais donne des résultats finaux bizare, pour x allant de 0 à 100 ca donne des résultats partant de 0, puis ca descend dans les négatifs pour retombé à 0 pour x=18,145 et après ca monte en fléche .. j'ai p'tet touché au formules sans faire exprès .. : p

J'ai cherché, j'ai pas trouvé :/
Erreurs sur erreurs la vie évolue, l'humanité est une des plus grandes sources d'erreurs.
11TLP #27 23/07/2007 - 19h18
  •   Up
Hors ligne Courriel


Mathématiques

pour les formules, il faut mettre toutes les parenthèses sinon ça fausse les calculs
azerty #28 19/09/2007 - 21h07
  •   Up
Hors ligne


toute les fonctions que vous venez de présenter marche surement très mais personnellement je préfère plutôt une approche récursive

pour le pgcd il existe deux algorithme de notre cher Euclide

1) Soit a et b deux entiers, si r est le reste de la division euclidienne de a par b, pgcd(a, b) = pgcd(b, r).

int pgcd(int a, int b)
{
    if (b == 0)
        return a;
    else
        return pgcd(b, a % b);
}


2) pgcd(a, b) = pgcd(a - b, b) (avec a >= b) ( la version de Général Vans )

int pgcd(int a, int b)
{
  if(!b)
    return a;
  else
    return pgcd(max(a - b, b), min(a - b, b));
}


Cependant la première fonction est plus rapide

Ensuite le ppcm on peut faire bcp plus simple

int ppcm(int a, int b)
{
    return (a * b) / pgcd(a, b);
}


Bon la factorielle c'est un classique de la récursivité

int factorielle(int n) {
    if(n == 0)
        return 1;
    else
        return (n * factorielle(n-1));
}


Et puis pour la puissance une simple petite adaptation permet de la faire en récursive
next #29 24/01/2008 - 14h17
  •   Up
Hors ligne


Voici le code d'exponentiation modulaire que je viens de faire, il est utile pour décrypter un code RSA. Résout : c et b^e congrut à m.

int exp_mod(int e, int m, int b)
{
  int c , e1;
 
  for(e1=0, c = 1; e1 < e; e1++)
     c = (b*c) % m;
  return c;
}

 >  Réponse rapide

Composez votre message

Hypo-thèses > Forum > Parlons sciences ! > Informatique > (re) création de fonctions mathématiques en C

 >  Informations du forum

1 personne(s) présente(s) sur ce forum au cours des dernières 20 minutes (0 membre(s) et 1 invité(s)).

top top

Temps de génération = 0.71826s | Accessibilité | Nous cont@cter
valid xhtml valid CSS firefox firefox