rt_nonfinite.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /*
  2. * rt_nonfinite.c
  3. *
  4. * Code generation for model "PMSM_Motor_TL3_sf".
  5. *
  6. * Model version : 1.825
  7. * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
  8. * C source code generated on : Fri Apr 14 12:51:02 2023
  9. *
  10. * Target selection: rtwsfcn.tlc
  11. * Note: GRT includes extra infrastructure and instrumentation for prototyping
  12. * Embedded hardware selection: ARM Compatible->ARM Cortex-M
  13. * Emulation hardware selection:
  14. * Differs from embedded hardware (MATLAB Host)
  15. * Code generation objectives:
  16. * 1. Execution efficiency
  17. * 2. RAM efficiency
  18. * Validation result: Not run
  19. */
  20. /*
  21. * Abstract:
  22. * Function to initialize non-finites,
  23. * (Inf, NaN and -Inf).
  24. */
  25. #include "rt_nonfinite.h"
  26. #include "rtGetNaN.h"
  27. #include "rtGetInf.h"
  28. #define NumBitsPerChar 8U
  29. real_T rtInf;
  30. real_T rtMinusInf;
  31. real_T rtNaN;
  32. real32_T rtInfF;
  33. real32_T rtMinusInfF;
  34. real32_T rtNaNF;
  35. /*
  36. * Initialize the rtInf, rtMinusInf, and rtNaN needed by the
  37. * generated code. NaN is initialized as non-signaling. Assumes IEEE.
  38. */
  39. void rt_InitInfAndNaN(size_t realSize) {
  40. (void) (realSize);
  41. rtNaN = rtGetNaN();
  42. rtNaNF = rtGetNaNF();
  43. rtInf = rtGetInf();
  44. rtInfF = rtGetInfF();
  45. rtMinusInf = rtGetMinusInf();
  46. rtMinusInfF = rtGetMinusInfF();
  47. }
  48. /* Test if value is infinite */
  49. boolean_T rtIsInf(real_T value) {
  50. return (boolean_T)((value==rtInf || value==rtMinusInf) ? 1U : 0U);
  51. }
  52. /* Test if single-precision value is infinite */
  53. boolean_T rtIsInfF(real32_T value) {
  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. boolean_T result = (boolean_T) 0;
  59. size_t bitsPerReal = sizeof(real_T) * (NumBitsPerChar);
  60. if (bitsPerReal == 32U) {
  61. result = rtIsNaNF((real32_T)value);
  62. } else {
  63. union {
  64. LittleEndianIEEEDouble bitVal;
  65. real_T fltVal;
  66. } tmpVal;
  67. tmpVal.fltVal = value;
  68. result = (boolean_T)((tmpVal.bitVal.words.wordH & 0x7FF00000) == 0x7FF00000 &&
  69. ( (tmpVal.bitVal.words.wordH & 0x000FFFFF) != 0 ||
  70. (tmpVal.bitVal.words.wordL != 0) ));
  71. }
  72. return result;
  73. }
  74. /* Test if single-precision value is not a number */
  75. boolean_T rtIsNaNF(real32_T value) {
  76. IEEESingle tmp;
  77. tmp.wordL.wordLreal = value;
  78. return (boolean_T)( (tmp.wordL.wordLuint & 0x7F800000) == 0x7F800000 &&
  79. (tmp.wordL.wordLuint & 0x007FFFFF) != 0 );
  80. }