rt_nonfinite.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * File: rt_nonfinite.c
  3. *
  4. * Code generated for Simulink model 'PMSM_Controller'.
  5. *
  6. * Model version : 1.885
  7. * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
  8. * C/C++ source code generated on : Sat Jan 8 15:44:11 2022
  9. *
  10. * Target selection: ert.tlc
  11. * Embedded hardware selection: ARM Compatible->ARM Cortex-M
  12. * Code generation objectives:
  13. * 1. Execution efficiency
  14. * 2. RAM efficiency
  15. * Validation result: Not run
  16. */
  17. /*
  18. * Abstract:
  19. * Function to initialize non-finites,
  20. * (Inf, NaN and -Inf).
  21. */
  22. #include "rt_nonfinite.h"
  23. #include "rtGetNaN.h"
  24. #include "rtGetInf.h"
  25. #define NumBitsPerChar 8U
  26. real_T rtInf;
  27. real_T rtMinusInf;
  28. real_T rtNaN;
  29. real32_T rtInfF;
  30. real32_T rtMinusInfF;
  31. real32_T rtNaNF;
  32. /*
  33. * Initialize the rtInf, rtMinusInf, and rtNaN needed by the
  34. * generated code. NaN is initialized as non-signaling. Assumes IEEE.
  35. */
  36. void rt_InitInfAndNaN(size_t realSize)
  37. {
  38. (void) (realSize);
  39. rtNaN = rtGetNaN();
  40. rtNaNF = rtGetNaNF();
  41. rtInf = rtGetInf();
  42. rtInfF = rtGetInfF();
  43. rtMinusInf = rtGetMinusInf();
  44. rtMinusInfF = rtGetMinusInfF();
  45. }
  46. /* Test if value is infinite */
  47. boolean_T rtIsInf(real_T value)
  48. {
  49. return (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
  50. }
  51. /* Test if single-precision value is infinite */
  52. boolean_T rtIsInfF(real32_T value)
  53. {
  54. return (boolean_T)(((value)==rtInfF || (value)==rtMinusInfF) ? 1U : 0U);
  55. }
  56. /* Test if value is not a number */
  57. boolean_T rtIsNaN(real_T value)
  58. {
  59. boolean_T result = (boolean_T) 0;
  60. size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
  61. if (bitsPerReal == 32U) {
  62. result = rtIsNaNF((real32_T)value);
  63. } else {
  64. union {
  65. LittleEndianIEEEDouble bitVal;
  66. real_T fltVal;
  67. } tmpVal;
  68. tmpVal.fltVal = value;
  69. result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) == 0x7FF00000 &&
  70. ( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 ||
  71. (tmpVal.bitVal.words.wordL != 0) ));
  72. }
  73. return result;
  74. }
  75. /* Test if single-precision value is not a number */
  76. boolean_T rtIsNaNF(real32_T value)
  77. {
  78. IEEESingle tmp;
  79. tmp.wordL.wordLreal = value;
  80. return (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 &&
  81. (tmp.wordL.wordLuint & 0x007FFFFF) != 0 );
  82. }
  83. /*
  84. * File trailer for generated code.
  85. *
  86. * [EOF]
  87. */