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

Bienvenue sur Forum SIG - Systmes d'Information Gographique et Gomatique.

Bienvenue sur le forumSIG. S'il s'agit de votre premire visite, assurez vous de faire une recherche pralable dans les FAQ SIG. Vous devez vous inscrire avant de pouvoir poster.

Affichage des rsultats 1 14 sur 14
  1. #1

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Problme de prcision dans les variables FLOAT

    Bonjour,

    Je rencontre un norme problme de prcision dans les variables Float o Mapinfo arrondit systmatiquement les valeurs, ce qui pose videmment des problmes dans les calculs ...

    tester dans une fentre 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 prcision maximale ?

    Un grand merci d'avance ceux qui pourraient rpondre la question !

  2. #2

    Date d'inscription
    avril 2016
    Messages
    52

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    A quel moment les variables sont-elles arrondies ? Dans la table de donnes ?

  3. #3

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Re : Problme de prcision 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 rpercutant dans chaque variable Float, diminue la prcision du rsultat.

    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
    52

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    Si tu rajoutes des 0 ici

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

    J'ai a comme rsultats :

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


    Aprs, si tu as beaucoup de chiffres aprs la virgule, il faudrait que ton nombre de 0 soit calcul en fonction du nombre de caractre maximum, je sais pas si c'est possible de mettre une variable ici...

  5. #5

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    Le problme 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 prcision de la valeur.

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

  6. #6

    Date d'inscription
    avril 2016
    Messages
    52

    Par dfaut Re : Problme de prcision 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 aprs 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 prcision, mais thoriquement 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)
    Dernire modification par raph0ux ; 24/01/2017 15h36.

  7. #7

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    Le problme n'est pas de retrouver les chiffres aprs la virgule, la fonction Format$ fonctionne.
    Elle me renvoie un rsultat 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 numrique ncessaire".
    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 prcision.
    Je peux en effet stocker beaucoup plus de chiffres aprs la virgule dans une variable de type texte, mais elle devient inexploitable pour d'autres calculs ...

  8. #8

    Date d'inscription
    avril 2016
    Messages
    52

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    Ah, effectivement vu comme a... !

    Et si la place de flottant tu choisis dcimal, o tu fixes le nombre de chiffres au niveau de ton plus long nombre, il ne fais tout de mme pas l'arrondi ?

  9. #9

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Re : Problme de prcision 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 dcimale ...

  10. #10

    Date d'inscription
    avril 2016
    Messages
    52

    Par dfaut Re : Problme de prcision dans les variables FLOAT

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

  11. #11

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    Imaginons que a fonctionne :

    - Je passe le rsultat de mon calcul dans une variable de type texte avec Format$ qui a une grande prcision
    - J'ajoute une ligne dans une table avec le nom de mon rsultat et le rsultat dans un champ dcimal (15, 10).
    - J'enregistre.

    Comment je continue les calculs suivants ?

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

    Ajouter une colonne par rsultat ?
    Champ1 (dcimal(15, 10) = 1er rsultat
    Champ2 (dcimal(15, 10) = 2me rsultat
    Champ3 (dcimal(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 prcis.
    Bref, je n'ai pas de solution.

  12. #12

    Date d'inscription
    avril 2016
    Messages
    52

    Par dfaut Re : Problme de prcision dans les variables FLOAT

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

    Mais aprs ne connaissant pas vraiment le primtre ou le but de ce que tu veux faire, pas vident :p

  13. #13

    Date d'inscription
    aot 2011
    Localisation
    Paris > Strasbourg
    Emploi
    Charg de mission SIG
    ge
    33
    Messages
    1 368

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    videmment, je peux trs bien pour un travail ponctuel passer par des logiciels tiers type R qui se scriptent trs 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 vritable solution ...

  14. #14

    Date d'inscription
    avril 2016
    Messages
    52

    Par dfaut Re : Problme de prcision dans les variables FLOAT

    Effectivement, je pense qu'il y a trop de contraintes pour russir les dtourner mme en bidouillant bien. La seule solution maintenant c'est de contacter PB pour leur demander un peu de dveloppement 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
    Rponses: 6
    Dernier message: 18/04/2012, 12h15
  2. [MapInfo 9.x] Desctruction de variables dans un .wor
    Par Flo49 dans le forum Assistance Technique
    Rponses: 2
    Dernier message: 24/03/2009, 18h33
  3. Rponses: 1
    Dernier message: 17/02/2009, 17h07
  4. [GDAL] Raliser un batch avec des variables dans un tableau
    Par ClaireLK dans le forum Assistance et Programmation
    Rponses: 2
    Dernier message: 17/06/2008, 17h38
  5. [MapBasic 4.x] Problme avec Add Column tb (var Float)
    Par houplineur dans le forum Programmation
    Rponses: 1
    Dernier message: 05/02/2007, 18h07

Liens sociaux

Rgles de messages

  • Vous ne pouvez pas crer de nouvelles discussions
  • Vous ne pouvez pas envoyer des rponses
  • Vous ne pouvez pas envoyer des pices jointes
  • Vous ne pouvez pas modifier vos messages
  •