begin process at 2013 06 19 01:52:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > FONCTIONS USUELLES (TRIGO) EN METAPROGRAMMATION

FONCTIONS USUELLES (TRIGO) EN METAPROGRAMMATION


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :template, fonctions, math, trigo, taylor Niveau :Débutant Date de création :07/06/2007 Date de mise à jour :08/06/2007 05:30:58 Vu / téléchargé :6 789 / 220

Auteur : coucou747

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note


 Description

Ma source montre un calcul des quelques fonctions suivantes :
cos, sin, tan, cosH, tanH, sinH, exp, ln, sqrt, fibonaci, triangle de pascal, ...
sans utiliser math.h, de telle sorte a pouvoir calculer ces fonctions lors de la compilation (quand elles sont appellees avec des valeurs constantes), et ca fonctionne sur tout type de donnees (faites une classe fraction qui ai les bons operateurs, et ca pourra aller dessus)

CECI NE REMPLACE PAS math.h !

Ces quelques classes ne sont pas aussi precises sur des floats
(mais permettent de traiter tout type de donnees, donc seraient plus precises que des floats sur un type permettant d'exploiter ces cadeaux du Cpp)
Il y a aussi le cote vitesse a prendre en compte : la, beaucoup de choses sont calcules lors de la compilation et non a l'execution :)

Ces fonctions sont parfois bases sur des DLN, parfois sur des relations de limites de suites tout a fait classiques...
J'aurais pu faire des integralles pour calculer certaines valeurs, ce qui aurait fait de jolies sommes de riehman,
j'ai pas vraiment teste sur autre chose qu'un float donc cote vitesse de convergence et precision, je ne sais pas si ca aurait apporte...
pour certaines fonctions, il est certain qu'a partir d'une derivee simple, j'aurais pu diminuer le nombre d'operations, seulement,
les derivees simples, ca ne se trouve pas toujours...

cf : http://en.wikipedia.org/wiki/Arcsin

Il me manque quelques fonctions :
pow qui s'obtient a partir de ln et exp
arcHsin \
arcHcos  |-> cf forme logarithmique, on l'a a partir de ln
arcHtan /



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

08 juin 2007 05:30:58 :
suppression des fichiers temporairs, ajout de deux mains pour sortir des comparatifs en asm, ajout de ces asm (Merci NitRic)

 Sources du même auteur

[C ANSI] TAS (PRIORITY QUEUE)
Source avec Zip INTERPRETEUR BRAINFUCK
Source avec Zip Source avec une capture COMMENTAIRES DOXYGEN VERS VISUAL
Source avec Zip INTERPRETEUR D'UN LANGAGE PROCHE DU RPN
Source avec Zip SOLVEUR DE KAKORUS EN C++

 Sources de la même categorie

Source avec Zip LE PROBLÈME DU VOYAGEUR DE COMMERCE EN LANGAGE C (ANT SYSTEM... par casseur
Source avec Zip VECTEUR CREUX par stroke599
Source avec Zip Source avec une capture FONCTIONS EN ACTION par ringo73
CALCUL DE PI AVEC LA BIBLIOTHÈQUE GMP par lann
Source avec Zip Source avec une capture MAGEO3D, POUR GÉRER LES POINTS ET LES VECTEURS DE L'ESPACE R... par pgl10

 Sources en rapport avec celle ci

UTILISATION DES TYPELIST EN C++ par wyden
RESOLUTION D'UNE EQUATION DU SECOND DEGRÉ AVEC RACINES REEL... par maloum41
Source avec Zip Source avec une capture [C++] CLASSE DE GESTION DE FONCTIONS par pop70
Source avec Zip BIBLIOTHEQUE FONCTIONNELLE : OPÉRATIONS, COMPOSITION D'OBJET... par ordiman85
Source avec Zip EVALUATEUR D'EXPRESSION AVEC VARIABLES INDEXÉES par DragonRapide

Commentaires et avis

Commentaire de BruNews le 07/06/2007 15:50:03 administrateur CS

récursion = risque explosion de la pile + lenteur.

Commentaire de spiky31 le 07/06/2007 16:56:47

Désolé mais la ca na rien avoir avec la recursion ...

Coucou747 l'a bien expliqué : les calculs sont effectués a la COMPILATION.

Cette technique porte d'ailleurs un nom : la meta-programmation.

Confére ici : http://loulou.developpez.com/tutoriels/cpp/metaprog/

Commentaire de coucou747 le 07/06/2007 18:44:53 administrateur CS

gcc ne fait pas tout ce qu'il pourrait faire a la compilation, je testerais sous vs ce soir... (mais ma factorielle reste inferieure en temps a une boucle)

Commentaire de BruNews le 07/06/2007 19:57:03 administrateur CS

stp coucou, donne nous asm généré pour les 2 formes de factorielle par exemple avec le C/C++ correspondant.

Commentaire de coucou747 le 07/06/2007 21:07:07 administrateur CS

... j'etais sous windows a l'instant pour voir ce que ca rendait :
Suite a quelques conseils de NitRic, j'ai pris cette fonction main
int main(){
int a;clock_t begin, end;begin = clock();
for (int i=0;i<9000000;i++){
a=1;
for (int j=1;j<=15;j++)
a*=j;
}
end = clock();
std::cout << (unsigned long long)(begin - end) << " - " << a << std::endl;
begin = clock();
for (int i=0;i<9000000;i++)
a=Math<int, 15>::factorielle();
end = clock();
std::cout << (unsigned long long)(begin - end) << " - " << a << std::endl;
return 0;
}

sous visual en release:
18446744073709551148 - 2004310016
0 - 2004310016

sous linux (g++), ou sous visual en debug, j'ai quelquechose de different :
18446744073708611616 - 2004310016
18446744073708691616 - 2004310016

il te faudrait l'asm fourni par quel compilateur ? (pardonne moi, je ne sais pas utiliser vs, je ne sais pas lui faire cracher un assembleur, ni meme a g++ d'ailleur, et le man page de g++ fait 8000 ligne :()

Commentaire de BruNews le 07/06/2007 21:20:29 administrateur CS

Sous VS hyper simple.
Proprietes du projet, onglet C/C++, fichier de sortie
et tu indiques "Assembler + code source".
Tu trouveras fichier asm dans dossier release.

Attention à ce genre de petite fonction, VC pourrait ne pas empiler de param etc...
Faut faire au moins 2 appels de chaque dans ton main avec params dofferents pour assurer la sortie du vrai code.

Commentaire de coucou747 le 08/06/2007 05:32:08 administrateur CS

t'as les asm dans les fichiers html, ils correspondent aux mains commentes dans tcml.cpp

Commentaire de BruNews le 08/06/2007 09:42:56 administrateur CS

mov eax, valeur
ret 0

Voila tout ce qu'il y a, les calculs sont faits à la compilation comme dit en description (et que j'avais zappé).

Commentaire de coucou747 le 09/06/2007 01:55:35 administrateur CS

sous g++ faut compiler avec l'option -O2 et on a les memes optimisations

Commentaire de Arnaud16022 le 09/06/2007 11:57:48

Effectivement c'est plus rapide au runtime, mais je trouve la syntaxe très laide... on est bien d'accord, c'est de la syntaxe classique de métaprogrammation, mais je serais personnellement assez pour des typedef pour les types les plus fréquents.

Brunews -> bah ça alors tu ne connaissais pas ? j'avoue ne jamais avoir codé de truc comme ça personellement, mais la technique est connue ... venant de toi c'est surprenant :)
Anyway, merci pour l'option de sortie asm, jusqu'à présent je devais compiler en debug et regarder le désassembly au runtime :/

Commentaire de coucou747 le 09/06/2007 12:08:06 administrateur CS

en debug, ca ne donne rien de bon a ce sujet sous vc apparement...

la syntaxe, tu reproches le class T ? tu prefererais un truc genre Math<50>::... directement ?

Commentaire de BruNews le 09/06/2007 12:39:14 administrateur CS

arnaud16022 >
Non je n'emploie jamais cette prog. Technique certes connue mais comme d'hab je lis description et code en (moins que) diagonale, journées beaucoup trop courtes.
Quand je ne veux pas d'appel de fonction, je mets la valeur en dur, ce que fait le compilo.
Faut bien reconnaitre que j'emploie peu l'optimisation du compilo... encore que là on ne peut pas vraiment appeler ça ainsi, c'est un précalcul que je fais moi même d'ordinaire.

Commentaire de coucou747 le 09/06/2007 16:55:09 administrateur CS

personellement, je ne suis pas assez maso pour ecrire moi meme un DL50 de cos(x) en 0... on a des machines pour ca... autant faire une lib qui nous epargne ce travail (chose faite ici)

Commentaire de Arnaud16022 le 09/06/2007 23:06:45

Ben, je peux pas dire que je suis fan des define, mais la un truc genre
#define factoriellei(a) Math<int,a>::factorielle(); ne me déplairaît pas trop, qu'en pensez-vous ?

Commentaire de BruNews le 09/06/2007 23:15:11 administrateur CS

Bien d'accord coucou, faisons bosser les machines.
Mon idée est juste de mettre ce code dans un outil qui donne la constante à insérer dans le code, ça évite de se trimballer ces templates partout.

Commentaire de Arnaud16022 le 10/06/2007 01:26:52

ça va assez vite virer au troll C vs C++ jle sens ...
BruNews, fan de benchmarks que tu es, que dirais tu d'un chti essai entre un code comme ça:
Vect3D res = V1 + 4*V3;
en C ( voire en asm ) et en C++ métaprogrammé?

Théoriquement la version template bat l'asm, aussi fou que cela puisse paraître, car le compilo n'a pas a faire un arbre de calcul genre temp1 = V3, temp1.operator*(4) , temp1.operator+(V1), trucs du genre
Faisable aussi en asm, on est bien d'accord ! Mais automatisé en C++. Boost le fait assez bien je crois.

Commentaire de BruNews le 10/06/2007 01:34:28 administrateur CS

"version template bat l'asm" n'a pas de sens, le compilo produit un asm... donc au moins imitable.
Le 'metaprogrammé' donne les mêmes résultats précalculés avec des valeurs non connues à la compil ?
Bien des lustres que je n'ai pas abordé ce sujet, faudrait voir.

Commentaire de coucou747 le 10/06/2007 06:07:09 administrateur CS

avec les valeurs non constantes, ca depend comment t'as bosse... exemple : je ne alcule pas de factorielle sur une var non constante, mais je peux calculer un cos sur un truc non constant

Commentaire de coucou747 le 10/06/2007 08:01:49 administrateur CS

juste dans le but de virer les templates ? tu lacerais mapple ou autre ? pour avoir un dl50...

apres t'aurais un code incomprehensible (enfin ca, on a l'habitude...), et impossible a modifier

Commentaire de Arnaud16022 le 10/06/2007 10:43:10

Mais il aime ça, je crois ;)
pour le "imitable" on est à 100% d'accord. cf ma remarque: "Faisable aussi en asm, on est bien d'accord ! Mais automatisé en C++."

Par contre, dans le cadre de cette source bien précise, j'en viens à me poser la question de l'utilité: ça t'arrives souvent d'avoir à calculer des développements limités , connus à la compil qui plus est ? moi pas ^^
Remarque que je ne porte aucune critique sur ton code, hein, c'était juste une remarque.

Commentaire de coucou747 le 10/06/2007 11:16:34 administrateur CS

math.h te renvoi souvent trop de decimales pour cos et sin... tu t'en fous generalement que ton float ai une valeur legerement erronee car finalement, quand tu convertis en int a la fin pour placer ton point a l'ecran, bah tu perds cette precision, et meme si t'avais un decalage, decaler d'un pixel ou deux, c'est pas forcement genant...

Calculer un DL8, ca donne Math<float, 4>::cos(...) de cosX, et la, X peut etre variable, et on a une meilleur vitesse que cos dans <math.h>

18446744073709441616 - 1
18446744073708791616 - 1


pour float a;
clock_t begin, end;
float b=3;
begin = clock();
for (int i=1;i<900000;i++){
a=cos(b/i);
}
end = clock();
std::cout << (unsigned long long)(begin - end) << " - " << a << std::endl;
begin = clock();
for (int i=1;i<900000;i++){
a=Math<float, 6>::cos(b/i);
}
end = clock();
std::cout << (unsigned long long)(begin - end) << " - " << a << std::endl;

(en compilant avec -O2 -O3 sous g++, on est plus rapide que math.h) et un DL8 sur des fonctions genre cos(x), c'est deja d'une bonne precision...
bon, et sans parler de ca, pour les constantes, c'est du bonheur :)
De plus, calculer sur toute classe qui overload les operations + / * et -, je trouve ca plutot utile personellement...

Commentaire de Arnaud16022 le 10/06/2007 15:56:57

Le DL plus rapide au runtime que le cos ? oah, je savais pas.
Mais, de toute façon, au pire tu fais une lookup table de disons 360 valeurs ;) imbattable pour la vitesse ( comment ça pour la précision c'est lamentable ? ^^ )

Pour ton bench : le calcul prend suffisement de temps ? parce que bon, clock() ...

Commentaire de coucou747 le 20/06/2007 19:57:53 administrateur CS

je te laisses le loisir de refaire le bench si tu doutes, mon prof de math dit que cos utilise un dl, donc, si cos utilise un dl18 et que j'ai besoin de la precision d'un dl5, evidement...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

les fonctions et le Math [ par djamine ] beh bonsoir les programmeurs j'ai une problemeje veux en utilisant la formuletan x=2t/1-(t au carré) avec t=tg x/2et le fait que si x est petit par ex Math Trigo- Point commun de Vecteurs [ par jeanbb ] Bonjour, J'ai des objects qui se déplacent à l'aide de vecteurs dans un plan cartésien.je cherche une formule pour savoir si mes vecteurs ou droites Spécialisation template et fonctions inline [ par Samaths ] Bonjour à tous!Je suis nouveau sur le forum, mais je programme en C++ depuis quelques temps déjà (3 ans). Dans le cadre d'un projet (niveau universita fonctions de <math.h> inconnues par visual 2005 [ par nesgba ] bonjour a tous, voila ca fait maintenant quelques semaines que je suis passé a visual 2005 (la version complete) avant cela j'avais visual 6 (le fame Utilisation des fonctions [ par darkwhite ] Salut  a tous. Je viens juste de decouvrir le C et j'essaie d'ecrire un programme utilisant2 fonctions : pour utiliser le th de pythagore mon code  ee Problème de déclaration de fonction de picking [ par nisaloncaje ] Bonjour, dans mon programme je voulais faire du picking mais j'ia le problème suivant : je comptais mettre toutes les fonctions de picking dasn un fic Librairie Statistique C++ ? [ par apache38 ] Bonjour a tous,J'aimerais developper un petit programme de calcul statisque (moyenne, ecart type, Cpk ...etc rien de bien complique) avec affichage gr [C++] pb au niveau d'un .lib [ par Famidoo ] Bonjour, je souhaite générer une DLL.Pour cela ma DLL nécessite un certain nombre de fonctions présentent dans 3 .lib différentes que j'ai créé. Ainsi visual c++ express [ par SnOOpss ] Bonjour je viens de voir que visual c++ 2005 express est maintenant 100/100 gratuit et je trouve ca un peu bizarre connaissant microsoft. J'ai fait qu C'est ça un template ??? [ par wismerhill__ ] Bonjour, j'ai un probleme que je pense etre simple mais bon ...J'ai une classe A dont un attribut est actuelement un std::vector&lt;*B&gt;Une classe B


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Juin 2013
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,526 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales