Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QString::number returns NaN, but only after compilation
Forum Updated to NodeBB v4.3 + New Features

QString::number returns NaN, but only after compilation

Scheduled Pinned Locked Moved Unsolved General and Desktop
24 Posts 5 Posters 3.7k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Christian EhrlicherC Christian Ehrlicher

    @drew_hamilton said in QString::number returns NaN, but only after compilation:

    In a moment of desperation, I tried running it from Command Prompt thinking that it would display the debug output. Very interestingly, the number does not show up as nan if run from the command line. It shows up correctly.

    This means you've an uninitialized variable somewhere which leads to your nan.

    Would I have to setup a debug logging system?

    Simple QMessageBoxes will do it too, or use qWarning() and let it print to the console.

    D Offline
    D Offline
    drew_hamilton
    wrote on last edited by
    #12

    @Christian-Ehrlicher How could a variable be uninitialized when run from File Explorer and initialized when run from the command prompt?

    Christian EhrlicherC 1 Reply Last reply
    0
    • D drew_hamilton

      @Christian-Ehrlicher How could a variable be uninitialized when run from File Explorer and initialized when run from the command prompt?

      Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #13

      @drew_hamilton said in QString::number returns NaN, but only after compilation:

      How could a variable be uninitialized when run from File Explorer and initialized when run from the command prompt?

      You said in debug mode it's fine so it can be that the memory the variable points to is initialized to a usable value, in release mode it's not. So it's a common uninitialized variable problem.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      JonBJ 1 Reply Last reply
      0
      • Christian EhrlicherC Christian Ehrlicher

        @drew_hamilton said in QString::number returns NaN, but only after compilation:

        How could a variable be uninitialized when run from File Explorer and initialized when run from the command prompt?

        You said in debug mode it's fine so it can be that the memory the variable points to is initialized to a usable value, in release mode it's not. So it's a common uninitialized variable problem.

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by JonB
        #14

        @Christian-Ehrlicher
        While it does sound like an uninitialized, the OP actually wrote earlier:

        If I run this code in the QT IDE in either Release or Debug, the values show as numbers. If I run a standalone EXE that I have compiled, it shows as NaN.

        I think he's saying any version works from IDE, no version outside.

        I guess random memory contents could differ when run in those two cases. Otherwise maybe the environment is different for whatever measurements they do to collect the figures.

        @drew_hamilton
        If it is an uninitialized variable really you have to track it down.

        D 1 Reply Last reply
        0
        • JonBJ JonB

          @Christian-Ehrlicher
          While it does sound like an uninitialized, the OP actually wrote earlier:

          If I run this code in the QT IDE in either Release or Debug, the values show as numbers. If I run a standalone EXE that I have compiled, it shows as NaN.

          I think he's saying any version works from IDE, no version outside.

          I guess random memory contents could differ when run in those two cases. Otherwise maybe the environment is different for whatever measurements they do to collect the figures.

          @drew_hamilton
          If it is an uninitialized variable really you have to track it down.

          D Offline
          D Offline
          drew_hamilton
          wrote on last edited by
          #15

          @JonB Correct.

          @Christian-Ehrlicher The variable is initialized as 666, just to make sure it has SOME value to begin with. It is initialized in public section of my MainWindow class. This doesn't seem to be enough (when running as a standalone executable from File Explorer). If I overwrite the value directly before generating my QString, it will of course use that value. This means that somehow this variable is not initialized by my class, but only in the context of running the executable from File Explorer. It is initialized when run from the IDE and when run from the Command Prompt as a standalone executable.

          Surely you can understand why I am scratching my head.

          The initialization happens something like this:

          class MainWindow : public QMainWindow
          {
          Q_OBJECT

          public:
          MainWindow(QWidget *parent = nullptr);
          ~MainWindow();

          void setup_layout_for_serialComs();
          

          ... blah blah...

           float RX_freq_hz = 666;
           float TX_freq_hz = 666;
          
          JonBJ Christian EhrlicherC 2 Replies Last reply
          0
          • D drew_hamilton

            @JonB Correct.

            @Christian-Ehrlicher The variable is initialized as 666, just to make sure it has SOME value to begin with. It is initialized in public section of my MainWindow class. This doesn't seem to be enough (when running as a standalone executable from File Explorer). If I overwrite the value directly before generating my QString, it will of course use that value. This means that somehow this variable is not initialized by my class, but only in the context of running the executable from File Explorer. It is initialized when run from the IDE and when run from the Command Prompt as a standalone executable.

            Surely you can understand why I am scratching my head.

            The initialization happens something like this:

            class MainWindow : public QMainWindow
            {
            Q_OBJECT

            public:
            MainWindow(QWidget *parent = nullptr);
            ~MainWindow();

            void setup_layout_for_serialComs();
            

            ... blah blah...

             float RX_freq_hz = 666;
             float TX_freq_hz = 666;
            
            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by JonB
            #16

            @drew_hamilton
            But the question is what happens to this RX_freq_hz from now on. We assume it's updated all the time? If that calculation make it become nan because of some issue elsewhere. I assume if you left it at 666 and never updated it it would never show as nan!?

            Use bool qIsNaN(double d) immediately before you go QString::number(RX_freq_hz), or whatever you display. I assume that returns true when nan is displayed. Then it's not a QString::number() issue, it's the value for sure. Wherever that comes from.

            1 Reply Last reply
            0
            • D drew_hamilton

              @JonB Correct.

              @Christian-Ehrlicher The variable is initialized as 666, just to make sure it has SOME value to begin with. It is initialized in public section of my MainWindow class. This doesn't seem to be enough (when running as a standalone executable from File Explorer). If I overwrite the value directly before generating my QString, it will of course use that value. This means that somehow this variable is not initialized by my class, but only in the context of running the executable from File Explorer. It is initialized when run from the IDE and when run from the Command Prompt as a standalone executable.

              Surely you can understand why I am scratching my head.

              The initialization happens something like this:

              class MainWindow : public QMainWindow
              {
              Q_OBJECT

              public:
              MainWindow(QWidget *parent = nullptr);
              ~MainWindow();

              void setup_layout_for_serialComs();
              

              ... blah blah...

               float RX_freq_hz = 666;
               float TX_freq_hz = 666;
              
              Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #17

              @drew_hamilton said in QString::number returns NaN, but only after compilation:

              It is initialized in public section of my MainWindow class.

              But you modify it somewhere and access an uninitialized value there.

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              D 1 Reply Last reply
              0
              • Christian EhrlicherC Christian Ehrlicher

                @drew_hamilton said in QString::number returns NaN, but only after compilation:

                It is initialized in public section of my MainWindow class.

                But you modify it somewhere and access an uninitialized value there.

                D Offline
                D Offline
                drew_hamilton
                wrote on last edited by
                #18

                @Christian-Ehrlicher I'm wondering how it would be possible to put a NaN value into a float as it is just 4 bytes. Assuming the variable EXISTS, anything you put into it should be between -32767 and 32767. Maybe I misunderstand something about how that works.

                Christian EhrlicherC 1 Reply Last reply
                0
                • D drew_hamilton

                  @Christian-Ehrlicher I'm wondering how it would be possible to put a NaN value into a float as it is just 4 bytes. Assuming the variable EXISTS, anything you put into it should be between -32767 and 32767. Maybe I misunderstand something about how that works.

                  Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #19

                  @drew_hamilton said in QString::number returns NaN, but only after compilation:

                  NaN value into a float as it is just 4 bytes. Assuming the variable EXISTS, anything you put into it should be between -32767 and 32767.

                  Ok, now please go back to the basics... float is not an integral number...

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  D 1 Reply Last reply
                  0
                  • Christian EhrlicherC Christian Ehrlicher

                    @drew_hamilton said in QString::number returns NaN, but only after compilation:

                    NaN value into a float as it is just 4 bytes. Assuming the variable EXISTS, anything you put into it should be between -32767 and 32767.

                    Ok, now please go back to the basics... float is not an integral number...

                    D Offline
                    D Offline
                    drew_hamilton
                    wrote on last edited by
                    #20

                    @Christian-Ehrlicher Right, I guess what im saying is that any arbirtrary arrangement of bits that as up to four bytes should be a valid number of some kind, right?

                    Christian EhrlicherC 1 Reply Last reply
                    0
                    • D drew_hamilton

                      @Christian-Ehrlicher Right, I guess what im saying is that any arbirtrary arrangement of bits that as up to four bytes should be a valid number of some kind, right?

                      Christian EhrlicherC Offline
                      Christian EhrlicherC Offline
                      Christian Ehrlicher
                      Lifetime Qt Champion
                      wrote on last edited by Christian Ehrlicher
                      #21

                      @drew_hamilton said in QString::number returns NaN, but only after compilation:

                      I guess what im saying is that any arbirtrary arrangement of bits that as up to four bytes should be a valid number of some kind, right?

                      No, float is a IEEE-754 floating point number.

                      And now please go to all places where you modify this value and check them. Esp. if you e.g. divide by 0 for accident or similar.

                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                      Visit the Qt Academy at https://academy.qt.io/catalog

                      1 Reply Last reply
                      3
                      • mranger90M Offline
                        mranger90M Offline
                        mranger90
                        wrote on last edited by mranger90
                        #22

                        You get that number from "Somewhere", right ? Maybe an external device or library ?
                        If it doesn't work when executed outside of the IDE, then I would suspect some kind of race condition or hiccup when communicating with the device in that the timing has changed. In which case you are getting garbage bits that don't conform to a floating point number.

                        1 Reply Last reply
                        2
                        • D Offline
                          D Offline
                          drew_hamilton
                          wrote on last edited by
                          #23

                          I found a variable feeding this number that was not initialized with a value and this got rid of the issue. Still really scratching my head as to why it's not initialized in different contexts.

                          JonBJ 1 Reply Last reply
                          0
                          • D drew_hamilton

                            I found a variable feeding this number that was not initialized with a value and this got rid of the issue. Still really scratching my head as to why it's not initialized in different contexts.

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #24

                            @drew_hamilton said in QString::number returns NaN, but only after compilation:

                            I found a variable feeding this number that was not initialized with a value and this got rid of the issue.

                            There you are, as we ( @Christian-Ehrlicher) suggested!! Aren't you pleased you have tracked a nasty bug down?!

                            (BTW, do you have all compiler warnings on? You ought to. These days compilers are pretty good at telling you when they see a potentially-uninitialized variable used, but depends on your usage in code.)

                            Still really scratching my head as to why it's not initialized in different contexts.

                            It is never "initialized" in any context, since you have said it's "not initialized with a value" by your code. In that case, say it's on the stack (e.g. local variable), its value will be whatever happens to be in that memory location at the time. And, simply put, that can vary across builds, build-types, environments run from, time of day, or weather. You were "lucky" it ever worked OK, you may never find a pattern which tells you what its value was or why it varied.

                            1 Reply Last reply
                            4

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved