File: rtGetNaN.cpp

    1   /*
    2    * rtGetNaN.cpp
    3    *
    4    * Code generation for model "Controller".
    5    *
    6    * Model version              : 1.1303
    7    * Simulink Coder version : 8.3 (R2012b) 20-Jul-2012
    8    * C++ source code generated on : Sun Jun 01 14:58:10 2014
    9    *
   10    * Target selection: grt.tlc
   11    * Note: GRT includes extra infrastructure and instrumentation for prototyping
   12    * Embedded hardware selection: Generic->32-bit x86 compatible
   13    * Code generation objectives: Unspecified
   14    * Validation result: Not run
   15    */
   16   /*
   17    * Abstract:
   18    *      Function to intialize non-finite, NaN
   19    */
   20   
   21   #include "rtGetNaN.h"
   22   #define NumBitsPerChar                 8U
   23   
   24   extern "C" {
   25     /*
   26      * Initialize rtNaN needed by the generated code.
   27      * NaN is initialized as non-signaling. Assumes IEEE.
   28      */
   29     real_T rtGetNaN(void)
   30     {
   31       size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
   32       real_T nan = 0.0;
   33       if (bitsPerReal == 32U) {
   34         nan = rtGetNaNF();
   35       } else {
   36         uint16_T one = 1U;
   37         enum {
   38           LittleEndian,
   39           BigEndian
   40         } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
   41         switch (machByteOrder) {
   42          case LittleEndian:
   43           {
   44             union {
   45               LittleEndianIEEEDouble bitVal;
   46               real_T fltVal;
   47             } tmpVal;
   48   
   49             tmpVal.bitVal.words.wordH = 0xFFF80000U;
   50             tmpVal.bitVal.words.wordL = 0x00000000U;
   51             nan = tmpVal.fltVal;
   52             break;
   53           }
   54   
   55          case BigEndian:
   56           {
   57             union {
   58               BigEndianIEEEDouble bitVal;
   59               real_T fltVal;
   60             } tmpVal;
   61   
   62             tmpVal.bitVal.words.wordH = 0x7FFFFFFFU;
   63             tmpVal.bitVal.words.wordL = 0xFFFFFFFFU;
   64             nan = tmpVal.fltVal;
   65             break;
   66           }
   67         }
   68       }
   69   
   70       return nan;
   71     }
   72   
   73     /*
   74      * Initialize rtNaNF needed by the generated code.
   75      * NaN is initialized as non-signaling. Assumes IEEE.
   76      */
   77     real32_T rtGetNaNF(void)
   78     {
   79       IEEESingle nanF = { { 0 } };
   80   
   81       uint16_T one = 1U;
   82       enum {
   83         LittleEndian,
   84         BigEndian
   85       } machByteOrder = (*((uint8_T *) &one) == 1U) ? LittleEndian : BigEndian;
   86       switch (machByteOrder) {
   87        case LittleEndian:
   88         {
   89           nanF.wordL.wordLuint = 0xFFC00000U;
   90           break;
   91         }
   92   
   93        case BigEndian:
   94         {
   95           nanF.wordL.wordLuint = 0x7FFFFFFFU;
   96           break;
   97         }
   98       }
   99   
  100       return nanF.wordL.wordLreal;
  101     }
  102   }
  103