Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Problem to detect minimum value of a negative number



  • Hi guys,

    I'm trying to detect the maximum and the minimum y value from a plot. The maximum is ok. But I can not detect the correct negative number. I guess the problem may be the variable type, however I could not solve.

    My code is:

       auto plot10 = ui->customPlot_10;
       double y_max = 0.0;
       double y_min = 0.0;
    
       QVector<double> x(256), y(256);
    
           for (int i=0; i<x.size(); ++i)
           {
           x[i] = plot10->graph(0)->data()->at(i)->key;
           y[i] = plot10->graph(0)->data()->at(i)->value;  
                 
           if (y[i]>=y_max) y_max = y[i];
           if (y[i]<=y_min) y_min = y[i];
           qDebug () << "Min i: " << y_min;
           qDebug () << "Max i: " << y_max;
    
           }
    

    The Debug result shows that the code ignore the number signal, as you can see:

    Min i:  -0.14
    Min i:  -0.14
    Min i:  -0.14
    Min i:  -0.14
    Min i:  0.18
    Min i:  0.22
    Min i:  0.26
    Min i:  0.28
    Min i:  0.31
    Min i:  0.33
    Min i:  0.34
    //...
    

    Could someone help me?

    Cheers,


  • Lifetime Qt Champion

    Hi
    I would start by doing

    qDebug () << "value: " << y[i];
    to see the input data.

    You are using doubles so it should not be the issues since its mostly doing ==
    (is equal that can be tricky )

    That said
    You could use
    #include <algorithm>
    double min = *std::min_element(vec.constBegin(), vec.constEnd());
    double max = *std::max_element(vec.constBegin(), vec.constEnd());
    If you build the vector first.



  • HI, I don't think this will work with both <= and >= conditions. They should be just < or > and you should init them with y_max as a smaller value than the range you expect and y_min with a larger value than the range you expect.

    y_max = REAL_MIN; // or something else very small
    y_min = REAL_MAX; // or something else very large
    ...
    if (y[i]>y_max) y_max = y[i];
    if (y[i]<y_min) y_min = y[i];
    

    should work better.



  • Don't reinvent the wheel

    QSharedPointer<QCPGraphDataContainer > graphData = ui->customPlot_10->graph(0)->data();
    const double y_max = std::max_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.value<b.value;})->value;
    const double y_min = std::min_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.value<b.value;})->value;
    const double x_max = std::max_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.key<b.key;})->key;
    const double x_min = std::min_element(graphData->cbegin(),graphData->cend(),[](const QCPGraphData& a, const QCPGraphData& b)->bool{return a.key<b.key;})->key;
    


  • Thank you guys your solutions are great and i'm gonna to use in different applications!!

    Cheers,


Log in to reply