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

Shell et commandes GNU Discussion :

awk n'en finit plus de me décevoir


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 307
    Par défaut awk n'en finit plus de me décevoir
    Bonjour

    Déjà, il y avait une attitude malsaine de awk à attribuer un type à une donnée, par défaut, et on ne savait pas s'il considérait le nombre à virgule, l'entier, ou le texte. Un texte vaut 0, un entier subit la division entière, et un réel, la division réelle. Le résultat est donc aléatoire, et indétectable.

    Mais, à l'instant, il vient de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk '($1==307){n=($1*16+1)^(1.0/3); {print $1,n,int(n);exit;}}' fichier.txt
    307 17 16
    Ah ben oui ! La partie entière de 17, c'est 16 ! Pensez-donc.

    Et après, on va nous dire "Non, les machines ne sont pas capables de générer de l'aléatoire.".

    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 814
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    La partie entière de 17, c'est 16 !
    Ta phrase est fausse mais le résultat de awk SEMBLE juste

    $1*16+1 -> 307*16 + 1 = 4913
    1.0/3 = 0.333333...

    4913 ^ 0.33333.... = 16,999518360554479181691445785574
    int(16.9995) = 16

    Pour rappel, il y a de fortes chances que la puissance soit calculée avec 1 exponentielle: x^y = exp(y * ln(x)).
    Il me semble que c'est le calcul bulldozer (lorsque tu as une puissance négative ou réelle) ... mais introduit une [très très] légère perte de précision: 17 ~ 16,9995

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 426
    Par défaut
    Et oui, de plus pour rappel:
    Numeric Functions
    AWK has the following built-in arithmetic functions:

    atan2(y, x) Return the arctangent of y/x in radians.

    cos(expr) Return the cosine of expr, which is in radians.

    exp(expr) The exponential function.

    int(expr) Truncate to integer.
    truncate n'est pas arrondi...
    Cordialement.

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 307
    Par défaut
    Citation Envoyé par foetus Voir le message
    int(16.9995) = 16
    Je suis bien d'accord avec toi. Mais il n'affiche pas 16.9995, auquel cas il serait pardonné. Il affiche 17. Faut savoir.

    C'est tout le problème de la discontinuité. Ce n'est pas un problème de précision.
    1=0.999999999999999999999999999999999999999...
    E(1)=1
    E(0.999999999999999999999999999999999999999...)=0
    Le problème est mathématique, et non informatique.

    1,000000000000000000...2=0,11111111111111111111111111...2. Pourtant, les deux nombres égaux ont une écriture complètement opposée.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 426
    Par défaut
    En effet, c'est mathématique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo 307 | awk 'BEGIN{OFMT="%.17g"}($1==307){n=($1*16+1)^(1.0/3); {print $1,n,int(n);exit;}}'
    307 16,999999999999996 16
    Cordialement.

Discussions similaires

  1. [11gR2] Requête qui n'en finit plus
    Par paqjos dans le forum SQL
    Réponses: 3
    Dernier message: 12/08/2015, 17h27
  2. Somme cumulative qui n'en finit plus
    Par aerf29 dans le forum Webi
    Réponses: 4
    Dernier message: 21/05/2014, 15h12
  3. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 13h28
  4. Réponses: 3
    Dernier message: 16/12/2002, 17h12
  5. [Datareport] Etat plus large que le papier
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/09/2002, 12h45

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