Bienvenue! Inscrivez-vous et rejoignez notre communauté :)
  • Login:

Bienvenue sur Forum SIG - Systèmes d'Information Géographique et Géomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre première visite, assurez vous de faire une recherche préalable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Affichage des résultats 1 à 14 sur 14
  1. #1

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Problème de précision dans les variables FLOAT

    Bonjour,

    Je rencontre un énorme problème de précision dans les variables Float où Mapinfo arrondit systématiquement les valeurs, ce qui pose évidemment des problèmes dans les calculs ...

    À tester dans une fenêtre Mapbasic :

    Code:
    Dim val1 As Float
    Dim val2 As Float
    
    val1 = 15.123456
    val2 = 58.9999999999
    
    Print val1 + val2
    Print Format$(val1 + val2, "#.0000000")
    Comment faire sous Mapinfo pour conserver la précision maximale ?

    Un grand merci d'avance à ceux qui pourraient répondre à la question !

  2. #2

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    A quel moment les variables sont-elles arrondies ? Dans la table de données ?

  3. #3

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Re : Problème de précision dans les variables FLOAT

    Dans les traitements, essaie le code que j'ai mis dans mon premier post et tu verras :
    Code:
    IN> Dim val1 As Float
    IN> Dim val2 As Float
    
    IN> val1 = 15.123456
    IN> val2 = 58.9999999999
    
    IN> Print val1 + val2
    OUT> 74.1235
    
    IN> Print Format$(val1 + val2, "#.0000000")
    OUT> 74,1234560
    Et cette erreur, se répercutant dans chaque variable Float, diminue la précision du résultat.

    La seule solution que j'ai trouvé est de multiplier la variable avant calcul :
    Code:
    IN> Dim val1 As Float
    IN> Dim val2 As Float
    
    IN> val1 = 15.123456
    IN> val2 = 58.9999999999
    
    IN> Print (val1 + val2)*100000
    OUT> 741235.6
    
    IN> Print Format$((val1 + val2)*100000, "#.0000000")
    OUT> 7412345,5999900
    Mais j'avoue que c'est source d'erreur ensuite dans les traitements si à la fin on ne divise pas par la bonne puissance de 10.

  4. #4

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    Si tu rajoutes des 0 ici

    Code:
    Print Format$(val1 + val2, "#.0000000")
    C'est bon non ?

    J'ai ça comme résultats :

    74.1235 (val1+val2)
    74,1234560 (val1 + val2, "#.0000000")
    74,1234559999 (val1 + val2, "#.0000000000")


    Après, si tu as beaucoup de chiffres après la virgule, il faudrait que ton nombre de 0 soit calculé en fonction du nombre de caractère maximum, je sais pas si c'est possible de mettre une variable ici...

  5. #5

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Re : Problème de précision dans les variables FLOAT

    Le problème ici est que la fonction 'Format$' renvoie un type texte (string).
    Les calculs ne sont pas possibles avec un type texte.
    Je suis obligé de les transformer en Float et de nouveau, perdre la précision de la valeur.

    Mis à part la multiplication, je n'ai pas d'autre alternative.

  6. #6

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    En passant par là (il manque une étape, mais je ne connais pas le code en MB) en VBA ça fonctionne donc a priori pas de raison que ça ne le fasse pas ici

    Code:
    Dim val3 as string
    val3 = "#.000000000000"
    Print Format$(val1 + val2, val3)
    74,123455999900
    Donc un truc du genre (on oublie ce que j'ai mis pour val3 au dessus) pour prendre le nombre de chiffre après la virgule du nombre le plus long

    Code:
    val4 = nbcar(val1)
    val5 = nbcar(val2)
    if val5 < val4 then
    val3 = val5
    else
    val3 = val4
    Et ensuite un bout de code pour rajouter des 0 sur la chaine #.000

    C'est laborieux juste pour ne pas perdre en précision, mais théoriquement ça doit fonctionner.

    En un peu moche ça donnerait :

    if val3 = 5
    then
    nbre0 = "#.00000"
    else
    ifval3 = 6
    then
    nbre0 = "#.000000"

    etc..

    Puis Print Format$(val1 + val2, nbre0)
    Dernière modification par raph0ux ; 24/01/2017 à 15h36.

  7. #7

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Re : Problème de précision dans les variables FLOAT

    Le problème n'est pas de retrouver les chiffres après la virgule, la fonction Format$ fonctionne.
    Elle me renvoie un résultat de type texte.

    Ce qui fait que lorsque sous Mapinfo on fait un :
    Code:
    Print format$("10.111111", "#.000000") * format$("5.555555", "#.000000")
    Il me renvoie un message d'erreur : "Valeur numérique nécessaire".
    Et si je fais :
    Code:
    Dim val1 As Float
    Dim val2 As Float
    
    val1 = 10.111111
    val2 = 5.555555
    
    Print val1 * val2
    Il me renvoie 56.1728. De nouveau une perte de précision.
    Je peux en effet stocker beaucoup plus de chiffres après la virgule dans une variable de type texte, mais elle devient inexploitable pour d'autres calculs ...

  8. #8

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    Ah, effectivement vu comme ça... !

    Et si à la place de flottant tu choisis décimal, où tu fixes le nombre de chiffres au niveau de ton plus long nombre, il ne fais tout de même pas l'arrondi ?

  9. #9

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Re : Problème de précision dans les variables FLOAT

    Et c'est là où le bas blesse, les types de variables pour Mapinfo sont :

    String
    Smallint
    Integer
    Float
    Object
    Alias
    Date
    Logical

    Pas de variable décimale ...

  10. #10

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    Et si tu mets les valeurs dans une table avec des champs Decimal(x,x) ?

  11. #11

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Re : Problème de précision dans les variables FLOAT

    Imaginons que ça fonctionne :

    - Je passe le résultat de mon calcul dans une variable de type texte avec Format$ qui a une grande précision
    - J'ajoute une ligne dans une table avec le nom de mon résultat et le résultat dans un champ décimal (15, 10).
    - J'enregistre.

    Comment je continue les calculs suivants ?

    Je prends une variable de type Float ? Non, car je perdrai en précision.
    Je dois prendre une variable de type texte, mais là, je suis bloqué pour mes calculs.

    Ajouter une colonne par résultat ?
    Champ1 (décimal(15, 10) = 1er résultat
    Champ2 (décimal(15, 10) = 2ème résultat
    Champ3 (décimal(15, 10) = mis à jour par Champ1 * Champ2.

    Ce n'est juste pas pratique ... Et puis en terme de rendement de processus, c'est juste aberrant.
    Le plus rapide est encore la multiplication par un facteur de 10 et retomber sur ses pattes à la fin, mais je serai bloqué pour plein de fonction type COSINUS où il me faut un angle précis.
    Bref, je n'ai pas de solution.

  12. #12

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    Le dernier recours serait de passer sous Excel et d'importer la table une fois le processus terminé.

    Mais après ne connaissant pas vraiment le périmètre ou le but de ce que tu veux faire, pas évident :p

  13. #13

    Date d'inscription
    août 2011
    Localisation
    Paris
    Emploi
    Chargé de mission SIG
    Âge
    33
    Messages
    1 164

    Par défaut Re : Problème de précision dans les variables FLOAT

    Évidemment, je peux très bien pour un travail ponctuel passer par des logiciels tiers type R qui se scriptent très bien, mais là, je souhaite que ça fonctionne dans une application avec formulaires, traitements, etc.
    sans impacter l'utilisateur.

    Alors exporter dans Excel n'est pas une solution non plus.
    Merci beaucoup pour ton aide, mais j'ai peu d'espoir d'avoir une véritable solution ...

  14. #14

    Date d'inscription
    avril 2016
    Messages
    43

    Par défaut Re : Problème de précision dans les variables FLOAT

    Effectivement, je pense qu'il y a trop de contraintes pour réussir à les détourner même en bidouillant bien. La seule solution maintenant c'est de contacter PB pour leur demander un peu de développement pour les prochaines mises à jour !

 

 

Discussions similaires

  1. [MapInfo 10.x] Modification du type d'une colonne en float qui ne fonctionne pas
    Par bjd1023 dans le forum Assistance Technique
    Réponses: 6
    Dernier message: 18/04/2012, 12h15
  2. [MapInfo 9.x] Desctruction de variables dans un .wor
    Par Flo49 dans le forum Assistance Technique
    Réponses: 2
    Dernier message: 24/03/2009, 18h33
  3. Réponses: 1
    Dernier message: 17/02/2009, 17h07
  4. [GDAL] Réaliser un batch avec des variables dans un tableau
    Par ClaireLK dans le forum Assistance et Programmation
    Réponses: 2
    Dernier message: 17/06/2008, 17h38
  5. [MapBasic 4.x] Problème avec Add Column tb (var Float)
    Par houplineur dans le forum Programmation
    Réponses: 1
    Dernier message: 05/02/2007, 18h07

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •