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

 C++ Discussion :

Soustraction de doubles


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Soustraction de doubles
    Bonjour,

    Bon je n'ai pas troué de réponse claire sur le net, donc je tente ici.

    Mon besoin :
    il s'agit de faire un programme qui traite des echantillons issue de test de charge, chaques echantillons est lié à une heure à la millisecond. je dois convertir cette heure (genre "15:32:12,500") en timestamp, afin de la soustraire au timestamps initial de début de test.

    J'ai déjà réaliser ce programme en VBscript malheureusement, ayant plusieur milliers d'échantillons (voir millions dans certains cas) je dois trouvé le moyen d'optimiser le temps de traitement, du coup je suis repassé sur le C++ qui est plus performant que le vbscript.

    j'ai quasiment fini le programme mais ... je suis confronté a un probléme qui m'est étrange :

    je convertit mon time stamp en double afin de faire la soustraction, puis je dois l'insérer dans mon fichier, mais je récupére toujours 0 ???!!!!!

    du coup un peu d'aide serait le bienvenue car j'ai fouillé le net et malgrés les réponses donné je n'arrive pas résoudre mon probléme.

    donc voici mon code (simplifié je vais pas tout mettre il fait plusieur page) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    #include <iostream>
    #include <string>
    #include <regex>
    #include <fstream>
    #include <sstream>
    #include <time.h>
    #include <vector>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iomanip>
     
    using namespace std;
     
    vector<string> explode(const string& str, const char& ch) {
        string next;
        vector<string> result;
        for (string::const_iterator it = str.begin(); it != str.end(); it++) {
            if (*it == ch) {
                if (!next.empty()) {
                    result.push_back(next);
                    next.clear();
                }
            } else {
                next += *it;
            }
        }
        if (!next.empty())
             result.push_back(next);
        return result;
    }
     
    double DateToTimeStamp(string date){
        string Millisecond = date.substr(date.rfind(","),date.size()-date.rfind(","));
        std::vector<std::string> MyTime = explode(date.substr(0,date.rfind(",")), ':');
     
        time_t now = time(NULL);
        struct tm * tmdate = localtime(&now);
        tmdate->tm_hour = atoi(MyTime[0].c_str());
        tmdate->tm_min = atoi(MyTime[1].c_str());
        tmdate->tm_sec = atoi(MyTime[2].c_str());
        now = mktime(tmdate);
        std::ostringstream strs;
        strs << static_cast<double> (now) << Millisecond;
        string test = strs.str();
     
        return atof(test.c_str());
    }
     
    int main(int argc, char *argv[])
    {
        double Decal = 0;
        for(int n=1; n<argc; n++){
            string heure = argc[n];
            if(Decal==0) Decal=DateToTimeStamp(heure);
            cout << DateToTimeStamp(result[a])-Decal << endl;
        }
    }
    donc en gros si mes paramétres son "12:53:12,500 12:53:12,650 12:53:13,000" j'aimerais que mon programme m'affiche :
    0
    150
    500

    Qqun a t'il une idée ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Ne convertissez pas vos timestamp en double.
    http://www.cplusplus.com/reference/ctime/difftime/

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Mars 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2013
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    ... la question est pourquoi ?

    Je peux revoir mon algorithme mais j'aimerais comprendre mon erreur.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Perso pour un timestamp j'utilise de l'uint. Et si ton format est aussi fixe et simple, des additions et multiplications seraient plus efficaces et simples à utiliser amha.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strs << static_cast<double> (now) << Millisecond;
    now est un time_t, qui est sur mon VS2015 un long. Pourquoi le caster en double ?
    Et c'est sensé faire quoi ce code ? Tu concatènes un double et une string ?!? As-tu vérifié tes valeurs intermédiaires ?
    Dans tous les cas, la sortie de ce truc doit pas être folichonne à voir.. D'ailleurs en quelle notation est sérialisé ce double dans ton stream ? 1.242e165 ? Puis tu concatènes ton 500 pour avoir un magnifique 1.242e165500 qui est très très très (...) très loin en overflow pour un double.
    Tu as now qui est un nombre de secondes, et Millisecond. La solution logique et triviale serait now * 1000 + tolong(Millisecond) ou bien dans ce cas et vu que ton Millisecond est une string stream<<now<<Millisecond; qui devrait fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string Millisecond = date.substr(date.rfind(","),date.size()-date.rfind(","));
        std::vector<std::string> MyTime = explode(date.substr(0,date.rfind(",")), ':');
    Des variables intermédiaires ne seraient pas un luxe.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Soustraction de deux doubles
    Par MarieKisSlaJoue dans le forum Général Java
    Réponses: 3
    Dernier message: 30/10/2014, 11h58
  2. Soustraction de 2 nombres de type double
    Par mercure07 dans le forum C++
    Réponses: 4
    Dernier message: 11/06/2010, 19h09
  3. [MySQL] soustraction de deux nombre de type double
    Par magda62 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2009, 15h00
  4. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  5. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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