Bonjour,
Matlab affiche 5 chiffres par défaut pour chaque résultat. Je peux en avoir 16 en tapant "format long" mais j'en voudrais beaucoup plus (Maple le permet). Est-ce possible ?
Merci.
Bonjour,
Matlab affiche 5 chiffres par défaut pour chaque résultat. Je peux en avoir 16 en tapant "format long" mais j'en voudrais beaucoup plus (Maple le permet). Est-ce possible ?
Merci.
Par défaut, MATLAB effectue les calculs en virgules flottantes sur 64bits par défaut.
Ce qui donne une précision de :
donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 >> eps ans = 2.2204e-016
Je te laisse y réfléchir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 >> fprintf('%.50f\n',pi) 3.14159265358979310000000000000000000000000000000000
Je ne suis pas un grand spécialiste de ce type de calcul, mais connaissant l'auteur de la contribution, je ne peux que te conseiller d'étudier ceci : HPF - a big decimal class by John D'Errico
Very often I see people asking for a tool that offers more than 16 digits or so of accuracy. MATLAB itself only allows you to use doubles or singles in standard arithmetic, so that is the normal limit. The fact is, most of the time, if you can't do it with a double, you are doing something wrong. Good practices of numerical analysis are worth far more than any high precision tool. Even so, there are times when you will have a use for a bit of extra precision.
Ingénieur indépendant en mécatronique - Conseil, conception et formation
- Conception mécanique (Autodesk Fusion 360)
- Impression 3D (Ultimaker)
- Développement informatique (Python, MATLAB, C)
- Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)
« J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)
Le problème c'est que ce n'est pas précis après 16 décimales. Pi ne s'écrit pas avec tous ces zéros.
Ingénieur indépendant en mécatronique - Conseil, conception et formation
- Conception mécanique (Autodesk Fusion 360)
- Impression 3D (Ultimaker)
- Développement informatique (Python, MATLAB, C)
- Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)
« J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)
Ben oui je vois bien mais ya pas moyen d'augmenter cette précision ?
Il faut que j'utilise un autre logiciel, genre Maple ?
Bonjour,
C'est surprenant que tu aies besoin de plus de 16 chiffres après la virgule de précision !
Es-tu sûr de ne pas pouvoir optimiser ton code, càd limiter le nombre d'opérations pour arriver au résultat ?
Edit: en fait ça rejoint le commentaire de Dut. La première question à se poser, c'est pourquoi tu as besoin d'augmenter ta précision. Est-ce parce que tes calculs la dégradent, ou bien parce que ton résultat final doit être à plus de 16 chiffres.
Cdt,
Lhermine
Ah non, c'est pas après la virgule, il me faut tous les chiffres de 2^163, or ça se finit par pleins de zéros et c'est pas ça.
Pour les calculs de grand nombre, soit tu trouves une bibliothèque qui sait gérer ces calculs soit tu ruses :
2^163 possède log10(2^163)+1 chiffres, soit une 50aine.
Tu commences par allouer un tableau de la taille qui va bien
Tu crées une fonction de somme de 2 tableaux de même dimensions
Code : Sélectionner tout - Visualiser dans une fenêtre à part resArray = zeros(1,50);
Ensuite tu crées une fonction récursive powerOfTwo(n) qui va calculer le nombre en question, en utilisant 2^N-1=somme(2^i, i:0->N-1).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 arr = sumArray(arr1,arr2) arr = arr1+arr2; % ajoute ici de quoi traiter le cas où le contenu de chaque cas de arr doit être < 10, et qui cascade les unités en dizaine etc end
powerOfTwo(163,resArray) devrais te renvoyer le tableau tant attendu de valeurs.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 resArray = powerOfTwo(n,resArray) if 1==n arr = zeros(size(resArray)); arr(end) = 2; resArray = sumArray(arr,resArray); else for k = 1:n-1 resArray = sumArray(resArray,powerOfTwo(k,resArray )) end arr = zeros(size(resArray)); arr(end) = 1; resArray = sumArray(arr,resArray); end end
N'oubliez pas de consulter les FAQ Matlab et les tutoriels Matlab
Pas de question technique par MP, Merci
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager