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

QString::number returns NaN, but only after compilation

Scheduled Pinned Locked Moved Unsolved General and Desktop
24 Posts 5 Posters 3.3k Views
  • 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:

    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