FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Planétarium virtuel.
par Pedro Alvarez Hier à 16:57

» Roues dentées
par jean_debord Hier à 10:40

» Attention arnaque !
par mindstorm Jeu 19 Juil 2018 - 19:18

» Qui fait quoi ?
par silverman Mer 18 Juil 2018 - 15:21

» ITEM_SELECT N,L pour synedit
par silverman Mer 18 Juil 2018 - 15:20

» Boussole
par jean_debord Mer 18 Juil 2018 - 11:06

» Roue à n faces
par Marc Dim 15 Juil 2018 - 22:16

» Exemple d'une nouvelle version d'un GRID
par Jean Claude Ven 13 Juil 2018 - 10:32

» Une simple question
par Oscaribout Sam 7 Juil 2018 - 23:20

» BUG sur l'objet TAB
par Jack Sam 7 Juil 2018 - 21:12

» Monopoly moderne
par jjn4 Sam 7 Juil 2018 - 15:06

» Récapitulatif ludothèque panoramic jjn4
par jjn4 Ven 6 Juil 2018 - 17:41

» Lignes ondulées
par JL35 Ven 6 Juil 2018 - 17:39

» bug off_activate 0 : sans d'effet
par silverman Ven 6 Juil 2018 - 13:02

» Position des objets d'un conteneur dans FBPano et Panoramic
par Navigateur Ven 6 Juil 2018 - 12:59

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juillet 2018
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Partie fractionnaire d'un flottant

Aller en bas 
AuteurMessage
Marc

avatar

Nombre de messages : 803
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Partie fractionnaire d'un flottant   Lun 19 Fév 2018 - 21:15

Bonsoir à tous !

Constat et interrogation :scratch

Pourquoi la partie fractionnaire de 12,85 est différente de 112,85 ? Question

Code:
DIM a,b
a=112.85
b=12.85
PRINT FRAC(a)
PRINT FRAC(b)

Résultat :


Autre remarque :

MOD(112.85,112) donne le même résultat : 0.849999999999994

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 6302
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Partie fractionnaire d'un flottant   Lun 19 Fév 2018 - 21:38

Troublant en effet... problèmes de calcul interne...
il faudrait écrire
PRINT a-INT(a)
pour avoir la valeur exacte (0.85)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc

avatar

Nombre de messages : 803
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Partie fractionnaire d'un flottant   Lun 19 Fév 2018 - 22:32

Oui, JL35 et merci d'avoir répondu.

C'est effectivement ce que j'ai fait pour savoir combien il y a de décimales dans un nombre flottant.

Ceci est dans le cas d'une mise en forme (formatage) pour un affichage à l'écran, et non pas pour un quelconque calcul où l'erreur serait totalement insignifiante.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Partie fractionnaire d'un flottant   Lun 19 Fév 2018 - 22:43

Tu veux rester en 100 % Panoramic, ou est-ce qu'une fonction DLL pourrait être utile ? Du genre à passer la valeur et une chaîne de caractères représentant le format, et au retour, tu recevrais une chaîne de caractères avec t valeur formatée selon tes critères ? Nombre de chiiffres avant et après la virgule, présence du signe ou non, et si oui, devant ou derrière le nombre, présentation flottante classique ou scientifique ? Ca peut se faire... Comme ça, tu maîtriserais les dimensions à afficher, et la virgule serait toujours à la même place.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Partie fractionnaire d'un flottant   Lun 19 Fév 2018 - 23:36

Tiens, je te propose une vieille routine qui est publiée sur mon site Web, page "Panoramic". Je l'ai mis un peu au goût du jour en transformant le sous-programme en fonction. Voici ce que ça donne, en 100 % Panoramic:
Code:


rem -------------------------------------------------------
rem     Test de la routine FORMAT_nombre
rem
rem     Seuls les labels et variables avec le préfixe format_
rem     font partie du code utile et doivent être inclus dans
rem     un programme utilisant cette routine. Voir la routine
rem     format_nombre pour le mode d emploi.
rem

label execute_format, window, objets
dim test_st$, test_n%, test_err%

dim format_nbr, format_frm$, format_out$, format_in$
dim format_maxdec%, format_nbr_virg%, format_frm_virg%, format_neg$
dim format_i%, format_j%, format_car$
rem On peut modifier ne nombre maximales de décimales à volonté:
format_maxdec% = 5

gosub window
gosub objets

end

window:
    left 0,223
    top 0,182
    width 0,380
    height 0,250
    caption 0,"Function FORMAT"
    return

objets:
    alpha 11
    left 11,31
    top 11,20
    width 11,80
    height 11,20
    caption 11,"Nombre:"
    edit 1
    left 1,131
    top 1,20

    alpha 12
    left 12,31
    top 12,50
    width 12,80
    height 12,20
    caption 12,"Décimales maxi:"
    edit 2
    left 2,131
    top 2,50
    width 2,40
    
    alpha 13
    left 13,31
    top 13,80
    width 13,80
    height 13,20
    caption 13,"Format:"
    edit 3
    left 3,131
    top 3,80
    width 3,220
    
    button 4
    left 4,131
    top 4,120
    caption 4,"Appliquer"
    on_click 4,execute_format

    alpha 15
    left 15,31
    top 15,160
    width 15,80
    height 15,20
    caption 15,"Résultat:"
    alpha 5
    left 5,131
    top 5,160
    width 5,220
    height 5,20
    return

execute_format:
  format_nbr = val(trim$(text$(1)))
  format_maxdec% = val(trim$(text$(2)))
  format_frm$ = trim$(text$(3))
  caption 5,format_nombre$(format_nbr,format_maxdec%,format_frm$)
  return  


rem ----------------------------------------------------------------------
rem    ici on a la partie utile du code
rem    en entrée, les variables suivantes doivent être chargées:
rem           format_nbr        nombre réel à convertir
rem           format_maxdec%    nombre de décimales maxi (5 est raisonnable)
rem           format_frm$       masque de formattage
rem    Le masque de formattage peut contenir n importe quelle chaîne de
rem    caractères. Les caractères #, °, µ et la virgule sont réservés:
rem          #    est remplacé par un chiffre
rem          °    est remplacé par un chiffre ou un espace
rem          µ    est remplacé par "-" si le nombre est négatif, sinon espace
rem          ,    représente l emplacement da la virgule décimale
rem
rem    Exemples:  (le signe ^ représente un espace)
rem        Nombre: -12.3456
rem        Format                          Résultat
rem        ---------------------------------------------------------------
rem        ###,##                          012,34
rem        °°°#,####                       ^^12,3400
rem        Avant:^°°#^Après:^###           Avant:^^12^Après:^340
rem        µ###,##                         -012,34
rem        °#,##^µ                         12,34^-
rem        #                               2
rem
rem        Nombre: 12072009 (12 Juillet 2009)
rem        Format                          Résultat
rem        ---------------------------------------------------------------
rem        °#/##/####                      12/07/2010
rem        ##-^#-####                      12-^7-2010
rem
rem    Au retour, le nombre formatté est dans la variable format_out$
rem
rem ----------------------------------------------------------------------
fnc format_nombre$(format_nbr,format_maxdec%,format_frm$)

  dim_local format_out$, format_in$
  dim_local format_nbr_virg%, format_frm_virg%, format_neg$
  dim_local format_i%, format_j%, format_car$


    format_out$ = ""
    format_neg$ = " "
    if format_nbr<0 then format_neg$ = "-"
    format_in$ = string$(20,"°")+str$(format_nbr)
    format_nbr_virg% = instr(format_in$,".")
    if format_nbr_virg%=0
        format_in$ = format_in$ + ","
        format_nbr_virg% = len(format_in$)
    end_if
    format_in$ = format_in$ + string$(format_maxdec%,"0")
    format_frm_virg% = instr(format_frm$,",")
    if format_frm_virg%=0
        format_frm$ = format_frm$ + ","
        format_frm_virg% = len(format_frm$)
    end_if
    format_j% = format_nbr_virg%
    for format_i%=format_frm_virg%-1 to 1 step -1
        format_car$ = mid$(format_frm$,format_i%,1)
        if format_car$="#"
                format_j% = format_j% - 1
                format_car$ = mid$(format_in$,format_j%,1)
                if format_car$="°" then format_car$ = "0"
                format_out$ = format_car$ + format_out$
        else
            if format_car$="°"
                format_j% = format_j% - 1
                format_car$ = mid$(format_in$,format_j%,1)
                if numeric(format_car$)=0 then format_car$ = " "
                format_out$ = format_car$ + format_out$
            else
                if format_car$="µ"
                    format_out$ = format_neg$ + format_out$
                else
                    format_out$ = format_car$ + format_out$
                end_if
            end_if
        end_if
    next format_i%
    if format_frm_virg%<len(format_frm$)
        format_out$ = format_out$ + ","
        format_j% = format_nbr_virg%
        for format_i%=format_frm_virg%+1 to len(format_frm$)
            format_car$ = mid$(format_frm$,format_i%,1)
            if format_car$="#"
                format_j% = format_j% + 1
                format_car$ = mid$(format_in$,format_j%,1)
                if format_car$="°" then format_car$ = "0"
                format_out$ = format_out$+ format_car$
            else
                if format_car$="°"
                    format_j% = format_j% + 1
                    format_car$ = mid$(format_in$,format_j%,1)
                    if numeric(format_car$)=0 then format_car$ = " "
                    format_out$ = format_out$ + format_car$
                else
                    if format_car$="µ"
                        format_out$ = format_out$ + format_neg$
                    else
                        format_out$ = format_out$ + format_car$
                    end_if
                end_if
            end_if
        next format_i%
    end_if
    
    result format_out$
end_fnc


C'est améliorable, mais c'est pas mal comme point de départ. J'ai écrit et publié cela en 2008 ou 2009, je pense.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc

avatar

Nombre de messages : 803
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Partie fractionnaire d'un flottant   Lun 19 Fév 2018 - 23:58


Merci Klaus ! J'étudie ça...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 659
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: Re: Partie fractionnaire d'un flottant   Mar 20 Fév 2018 - 11:28

Grace aux fonctions, tu peux te simplifier la vie. (J'ai adopté une convention personnel pour les fonctions que je te recommande)
Un mini code:
Code:
DIM a,b
a=-112.85
b=-12.85
PRINT FRAC(a)
PRINT FRAC(b)
print
PRINT FRAC_(a)
PRINT FRAC_(b)
END
' convention pour le caractère terminal d'une fonction:
' % pour les nombres entier(convention panoramic)
' _ pour les nombres à virgule <---convention personnel
' $ pour les chaînes de caratères(convention panoramic)
fnc FRAC_(v)
   result (abs(v)-int(abs(v)))*sgn(v)
end_fnc

EDIT: Tu peux aussi appeler cette fonction FRAC()(cad avec le mot-clé panoramic, sans ma convention personnel), car une "fnc" est vu comme une "variable" par panoramic et est prioritaire aux mot-clés de panoramic. Cela ne pose pas de pb pour une varaible d'être nommée avec le nom d'un mot-clé, comme l'a expliqué jack ICI(à la fin)
J'utilise cette convention personnel juste pour assurer une compatibilité des "fnc" avec la future version du compilateur
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
pascal10000

avatar

Nombre de messages : 703
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: Re: Partie fractionnaire d'un flottant   Mer 21 Fév 2018 - 8:16

bonjour
extraire la partie fractionnaire d'un chiffre

Code:
 Dim Numerateur$,Fraction$
  Label Fraction
  Input "Chiffre? ";Numerateur$
  INPUT_REDO_ON
  Gosub Fraction
  End
  Fraction:
 If frac(Val(Numerateur$))>0
 Fraction$=mid$(Numerateur$,instr_Pos(Numerateur$,".",1)+1,10)
 End_If
 Print Numerateur$
 Print "Extraction de la partie fractionnaire du chiffre"
 Print Fraction$
  Return

c'est une façon que j'utilise pour calculus
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc

avatar

Nombre de messages : 803
Age : 57
Localisation : TOURS
Date d'inscription : 17/03/2014

MessageSujet: Re: Partie fractionnaire d'un flottant   Mer 21 Fév 2018 - 13:19

Bonjour à tous et merci pour toutes vos réponses !

@Klaus : merci pour ton programme de formatage d'un nombre à l'affichage. C'est très pratique et universel ! Je le garde précieusement.

@JL35 : merci mais malheureusement la solution PRINT a-INT(a) ne fonctionne pas avec tous les flottants. Essaie avec 64932.951 et tu auras :



@Siverman : merci mais... ce n'est pas bon non plus :



@Pascal1000: merci aussi. Effectivement en tronquant le nombre de décimales, on supprime l'erreur d'affichage.

J'ai donc adopté la solution de tronquer les décimales.

Encore merci et bonne programmation à tous !


Dernière édition par Marc le Mer 21 Fév 2018 - 15:06, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 659
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: Re: Partie fractionnaire d'un flottant   Mer 21 Fév 2018 - 14:19

Tu peux également utiliser cette fonction:
Code:
fnc FRAC_(v)
   result val("0"+right$(str$(a),len(str$(a))-len(str$(int(a)))))*sgn(a)
end_fnc
Elle renvoie un nombre dans tous les cas et tient compte du signe
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Partie fractionnaire d'un flottant   

Revenir en haut Aller en bas
 
Partie fractionnaire d'un flottant
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Partie fractionnaire d'un flottant
» Quelle partie de votre cerveau utilisez-vous ?
» RPGMAKERVXACE! écran titre nouvelle partie ect...
» Supprimer une partie de trace
» Offre Ideo, résiliation de la partie internet

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: