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

JavaScript Discussion :

Cherche module de calcul JavaScript


Sujet :

JavaScript

  1. #1
    R�dacteur

    Avatar de danielhagnoul
    Homme Profil pro
    �tudiant perp�tuel
    Inscrit en
    F�vrier 2009
    Messages
    6 389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant perp�tuel
    Secteur : Enseignement

    Informations forums :
    Inscription : F�vrier 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par d�faut Cherche module de calcul JavaScript
    Bonjour

    Pour une page web, projet d'�tudiant non accessible sur l'internet, incluant des calculs astronomiques r�alis�s � la demande de l'utilisateur nous aurions eu besoin de 15 d�cimales exactes pendant tous les calculs. Je ne parle pas de la pr�sentation des r�sultats, mais bien de la pr�cision des calculs.

    Pour la pr�sentation des r�sultats, j'ai simplement utilis� nombre.toFixed(13) ce qui donne un nombre non ridicule (style 0.06 + 0.01 = 6.9999..) dans la tr�s grande majorit� des cas.

    La plupart des langages informatiques disposent d'un module math�matique, j'ai conseill� � l'�tudiant de r�aliser une seconde version en utilisant Python, mais je n'ai rien trouv� pour le JS sur Internet.

    Comme on trouve tout sur le web, j'ai peut-�tre mal cherch� ?

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues � un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  2. #2
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par d�faut
    Y'a un d�but de r�ponse sur ce post http://www.developpez.net/forums/d10...ecart-centime/

    Sinon y'a probablement quelque chose de plus abouti mais si c'est le cas je ne le connais pas.

  3. #3
    R�dacteur/Mod�rateur

    Avatar de SpaceFrog
    Homme Profil pro
    D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : D�veloppeur Web Php Mysql Html Javascript CSS Apache - Int�grateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par d�faut
    y'a bien une ou deux libs qui trainent, mais je ne sais pas ce qu'elles valent.

    En voici la plus connue
    http://jsfromhell.com/classes/bignumber
    Ma page Developpez - Mon Blog Developpez
    Pr�sident du CCMPTP (Comit� Contre le Mot "Probl�me" dans les Titres de Posts)
    Deux r�gles du succ�s: 1) Ne communiquez jamais � quelqu'un tout votre savoir...
    Votre post est r�solu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de D�veloppez !

  4. #4
    R�dacteur

    Avatar de danielhagnoul
    Homme Profil pro
    �tudiant perp�tuel
    Inscrit en
    F�vrier 2009
    Messages
    6 389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant perp�tuel
    Secteur : Enseignement

    Informations forums :
    Inscription : F�vrier 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par d�faut
    Bonsoir

    Je suis vraiment pass� � c�t� et n'a pas �t� mon ami. Je devrais peut-�tre utiliser plus souvent mon copain "bing".

    JSFromHell.com, en dehors de BigNumber, le site semble contenir d'autres perles.

    J'ai �galement, en cherchant cette fois avec "js big number", trouv� RSA and ECC in JavaScript

    Il me reste beaucoup de travail pour lire, comprendre, tester et comparer avant d'appliquer le meilleur.

    @SpaceFrog

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues � un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  5. #5
    R�dacteur

    Avatar de danielhagnoul
    Homme Profil pro
    �tudiant perp�tuel
    Inscrit en
    F�vrier 2009
    Messages
    6 389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activit� : �tudiant perp�tuel
    Secteur : Enseignement

    Informations forums :
    Inscription : F�vrier 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par d�faut
    Bonsoir

    Malheureusement, BigNumber �choue pour la division (divide) et pour les fonctions qui utilise la division : pow, mod.

    60/0.06 = 1000.0114 !!!

    60/0.03 = 200.0327 !!!

    Pour l'instant, seul BigDecimal passe mes tests !

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues � un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  6. #6
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    D�cembre 2010
    Messages
    1 009
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : sans emploi

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 1 009
    Par d�faut
    parfait! tu vas avoir l'honneur d'�tre le tout premier testeur de ma lib :

    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
    // constructeur d'instance(Number|num|null) : this(typeof num)
    function num_constructor(v){
    	if(!v) return this.val=""+(this.neg=this.pos=0),this; // 0
    	this.neg = (v = v.toExpString()).charAt(0) == '-';
    	this.val = ((v = v.replace(/[^\d.]/g,'').split('.', 2))[0] = v[0].replace(/^0+/,'') || '0') + (v[1] = v[1] || '',v[1].replace(/0+$/,''));
    	this.pos = v[1].length;
    	delete v
    } 
    // constructeur(Number|num|null) : new num
    function num(v){
    	return v instanceof num_constructor?((this instanceof num_constructor)?v.copy():v):new num_constructor(v)
    }
    // num:prototype
    p = num_constructor.prototype = num.prototype;
    // "0000000000...00000000000" (^310)
    num.MAX_ZERO=(function(max){
    	for(var i=1,zero='0';i<max;i*=2)
    		zero+=zero;
    	return zero.substring(0,max-1)
    })(Number(Number.MAX_VALUE.toString().split('e')[1]));
    // copy : new num
    p.copy = function(){
    	var v = new num_constructor();
    	v.neg = this.neg;
    	v.val = this.val;
    	v.pos = this.pos;
    	return v
    };
    // partie entière : String
    p.left = function(){
    	return this.val.substring(0,this.val.length-this.pos)
    };
    // partie décimale : String
    p.right = function(){
    	return this.val.substring(this.val.length-this.pos,this.val.length)
    };
    // valeur complete : String
    p.valueOf = p.toString = function(){
    	return (this.neg?'-':'')+this.left()+"."+this.right()
    };
    // valeur complete : Number
    p.Number = function(){
    	return Number(this.valueOf())
    };
    // puissance du nombre : Number
    p.power = function(){
    	return this.val.replace(/^0+/,'').length-this.pos-1
    };
    // (this<v)=[-1] (this==v)=[0] (this>v)=[1]
    p.compare = function(v){
    	return (this.neg != (v=num(v)).neg)?(this.neg?-1:1):(this.neg?(-this.compareAbs(v)):this.compareAbs(v))
    };
    // (abs(this)<abs(v))=[-1] etc...
    p.compareAbs = function(v){
    	var a=this,b=num(v);
           if(a.power() != b.power())  
    		return ((a.power()>b.power()))?1:-1;
    	var l=Math.min((a=a.val.split('')).length,(b=b.val.split('')).length),i=-1;
    	while(++i<l)
               if(a[i] != b[i]) 
    			return (a[i]>b[i])?1:-1;
    	return 0;
    }
    // renvoie une copie "positive" : new num
    p.abs = function(){
    	var r=this.copy();
    	return r.neg=0,r
    };
    // supprime les "0" de trop en début et en fin du num : num;
    p.clean = function(){
    	var a=[];
    	a[0]=this.val.substr(0,this.val.length-this.pos).replace(/^0+/,'') || '0';
    	a[1]=this.val.substr(this.val.length-this.pos,this.val.length)||'';
    	a[1]=a[1].replace(/0+$/,'')
    	return this.pos=a[1].length,this.val=a.join(''),this;
    };
    // ajoute v au num : new num
    p.add = function(v){
    	var a=this, b=num(v), res=new num_constructor();
    	res.neg=(a.compareAbs(b)==1?a.neg:b.neg);
    	res.pos=Math.max(a.pos+b.pos);
    	res.val=num.MAX_ZERO+Math.abs(
    		parseInt((a.neg?'-':'')+a.val+num.MAX_ZERO.substr(0,res.pos-a.pos),10)
    		+parseInt((b.neg?'-':'')+b.val+num.MAX_ZERO.substr(0,res.pos-b.pos),10)
    	);
    	return res.clean();
    };
    // converti un Number en notation (n.e^x) vers la notation classique : String
    Number.prototype.toExpString = function(){
    	var val=this+'',t;
    	if(!val.match(/^([+-]?\d+(?:.\d+)?)e([-\+]?\d+)$/)) return val;
    	if(RegExp.$2<0) return ((val<0)?'-':'')+"0."+num.MAX_ZERO.substring(0,-RegExp.$2-1)+Math.abs(RegExp.$1.replace(".", ""));
    	return RegExp.$1.replace(".", "")+num.MAX_ZERO.substring(0,Number(RegExp.$2)-((t=RegExp.$1.split('.')[1])?t.length:0));
    } 
    // supprime v au num : new num
    p.sub = function(b){var r=num(b).copy();return r.neg=1-r.neg,this.add(r);}
    // multiplie le num par v : new num
    p.multi = function(b){ 
    	var a=this, b=num(b), res=new num_constructor();
    	res.neg=(a.neg^b.neg);
    	res.pos=a.pos+b.pos;
    	res.val=(num.MAX_ZERO+(parseInt(a.val,10)*parseInt(b.val,10)).toExpString()).replace('.','');
    	return res.clean();
    }
    // divise le num par v : new num
    p.div = function(b){
    	var c,a=this, b=num(b), res=new num_constructor();
    	res.neg=(a.neg^b.neg);
    	res.val=num.MAX_ZERO+(parseInt(a.val,10)/parseInt(b.val,10)).toExpString()+num.MAX_ZERO;
    	res.pos=((c=res.val.split('.')[1])?c.length:num.MAX_ZERO.length)-b.pos+a.pos;
    	res.val=res.val.replace('.','');
    	return res.clean();
    }

    exemple d'utilisation :
    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
    //== CONSTRUCTEURS ==
    // constructeur
    var e1 = num(-123.456); // num(Number) -> new num
    // cast
    e1 = num(e1); // num(num) -> new num[if (typeof e1==Number)] || num[e1]
    // copy
    var e2 = new num(e1); // new num(num) -> e1.copy() -> new num
    // == OPERATIONS ==
    // add
    var e3 = e1.add(e2); // num.add(Number) || num.add(num) -> new num
    // sub
    var e4 = e1.sub(e2); // num.sub(Number) || num.sub(num) -> new num
    // multi
    var e5 = e1.multi(e2); // num.multi(Number) || num.multi(num) -> new num
    // div
    var e6 = e1.div(e2); // num.div(Number) || num.div(num) -> new num
    // abs
    var e7 = e1.abs(); // -> new num
     
    // == TESTS ==
    // comparateur
    var e8 = e1.compare(e2); // num.compare(Number) || num.compare(num) -> -1,0,1
     
    // == RECUPERATIONS DES VALEURS ==
    // valeur sous forme de String
    var e9 = e1.toString(); // -> String
    var e10 = e1.valueOf(); // -> String
    // valeur sous forme de Number
    var e11 = e1.Number(); // -> Number
     
    for(i=1;i<12;i++)
    	document.write(i+') ',window['e'+i],'<br/>');
    ps:
    - inconv�nient : elle ne g�re pas encore les "bigNumber" (actuellement limit� � 16 chiffres devant ou � 16 chiffres derri�re la virgule). (ce sera pour la prochaine version.. pas grand chose � rajouter).

    - inconv�nient : elle comporte sans doute �norm�ment d'erreurs ! c'est pour �a que j'ai besoin de toi pour la tester.

    - avantage : elle corrige les erreurs de op�rations flottantes ! et ceci avec une rapidit� non n�gligeable puisque ne comporte aucune boucle (sauf pour la m�thode "compare" ... d�j� pr�vue pour les bigNumber et � l'initialisation de lib pour g�n�rer un grand string plein de "0").

    - avantage : le code fait moins de 4ko contre 200ko pour BigDecimal.



    edit: tiens pour une fois mon code est m�me (presque) lisible !


    nb: ce code ne fait rien d'autre que transformer les float en int via des string pour appliquer les op�rations sur des entiers et ensuite replacer la virgule(et le signe) au bon endroit.

    exemple :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    document.write("20 chiffres de chaque coté: "+num(100000000000000000000).multi(0.00000000000000000001),'<br/>');
    document.write("res avec lib: "+num(100000000000).multi(0.00000000001),'<br/>');
    document.write("res sans lib: "+100000000000*0.00000000001,'<br/>');
    version online de ma lib si tu veux tester certaines op�rations en particulier : http://willpower.110mb.com/sources/numeric.htm



    nb: n'h�sitez pas � rafra�chir la page pour voir diff�rentes valeurs par d�fauts prouver l'efficacit� du brol.


    edit: j'ai rajout� une iframe avec une recherche google de l'�quation pour comparer avec une r�sultat (je crois) fiable !

    Tiens dans ma lib j'ai des "uncaught illegal access" sur des RegExp.rightContext ... avec des Chaine.match(/[\*\/\+\-]/g) sur mes op�rations ... des op�rations qui ont toujours qqe chose � droite des op�rateurs (quand je fais des alert(Chaine) ). donc je ne comprend pas pourquoi �a plante. -> HELP PLEASE.


    edit: apparement ce probl�me n'apparait que sous chrome ... IE et Firefox marchent nickel "chrome" !

    ligne de code incrimin�e :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    if((e.match(/\*/g)) &&(v=[RegExp.leftContext,RegExp.rightContext]))
    voila, j'ai r�solu ce bug
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    	// prevent google chrome bug
    	// RegExp.rightContext : illegal acces
    	"abc".match("b");
    	// strange ! no ?
    if((e.match(/\*/g)) &&(v=[RegExp.leftContext,RegExp.rightContext]))
    maintenant, tout fonctionne nickel chrome : http://willpower.110mb.com/sources/numeric.htm


+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Module de Calcul Formel
    Par Try-again dans le forum Biblioth�ques tierces
    R�ponses: 2
    Dernier message: 18/12/2007, 17h22
  2. Cherche MODULE pour concat�ner des fichiers PDF
    Par DevPerl dans le forum Modules
    R�ponses: 1
    Dernier message: 21/10/2007, 17h11
  3. R�ponses: 1
    Dernier message: 17/10/2007, 10h55
  4. Je n'arrive pas a faire un controle dans un calcul javascript
    Par carmen256 dans le forum G�n�ral JavaScript
    R�ponses: 14
    Dernier message: 13/07/2006, 10h42
  5. cherche module ou langage pour r�cup�rer des donn�es audio..
    Par Ry_Yo dans le forum Langages de programmation
    R�ponses: 5
    Dernier message: 12/05/2003, 17h44

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