Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. #define min_float 0x00000000
  2. #define max_float 0xffffffff
  3.  
  4. #define exponent(x) (x << 1) >> 24
  5. #define mantissa(x) (x << 9) >> 9
  6. #define sign(x) x >> 31
  7.  
  8. uint32_t add(uint32_t x, uint32_t y) {
  9. uint32_t result_mantissa;
  10. uint32_t result_exponent;
  11. uint32_t result_sign;
  12.  
  13. uint32_t different_sign = sign(x) ^ sign(y); //boolean but lets not do any type casting
  14.  
  15. // catch NaN
  16. if (!(exponent(x) ^ 0xFF) && mantissa(x)) return x;
  17. if (!(exponent(y) ^ 0xFF) && mantissa(y)) return y;
  18.  
  19. // catch Inf
  20. if (!(exponent(x) ^ 0xFF) && !(exponent(y) ^ 0xFF)) {
  21. // both are inf
  22. if (different_sign)
  23. // Inf - Inf
  24. return 0x7F800000 + 1; // NaN
  25. else
  26. // both Inf or -Inf
  27. return x;
  28. }
  29. else if (!(exponent(x) ^ 0xFF)) return x;
  30. else if (!(exponent(y) ^ 0xFF)) return y;
  31.  
  32. // both numbers are non-special
  33. uint32_t exp_difference;
  34. if (different_sign) {
  35. exp_difference = exponent(y) + exponent(x);
  36. }
  37. else {
  38. // no need to account for constant BO
  39. // beware of underflow
  40. if (exponent(x) > exponent(y)) exp_difference = exponent(x) - exponent(y);
  41. else exp_difference = exponent(y) - exponent(x);
  42. }
  43.  
  44.  
  45. bool x_bigger_abs;
  46. if (exponent(x) > exponent(y)) x_bigger_abs = true;
  47. else if (exponent(x) < exponent(y)) x_bigger_abs = false;
  48. else if (mantissa(x) > mantissa(y)) x_bigger_abs = true;
  49. else x_bigger_abs = false;
  50.  
  51. if (!different_sign) {
  52. //both numbers have same sign (this is a sum)
  53. result_sign = sign(x);
  54.  
  55. if (x_bigger_abs) {
  56. result_mantissa = (mantissa(x) << 1) + (mantissa(y) << 1) >> exp_difference;
  57. result_exponent = exponent(x);
  58. }
  59. else {
  60. result_mantissa = (mantissa(y) << 1) + ((mantissa(x) << 1) >> exp_difference);
  61. result_exponent = exponent(y);
  62. }
  63. if (result_mantissa << 31) result_mantissa = (result_mantissa >> 1) + 1;
  64. else result_mantissa = (result_mantissa >> 1);
  65. }
  66. else {
  67. // this actually is a subtraction
  68.  
  69. if (x_bigger_abs) {
  70. result_sign = sign(x);
  71. result_exponent = exponent(x);
  72.  
  73. // subtract and round to 23 bit
  74. // this means making room in our 32bit representation
  75. result_mantissa = (mantissa(x) << 1) - ((mantissa(y) << 1) >> exp_difference );
  76. }
  77. else {
  78. result_sign = sign(y);
  79. result_exponent = exponent(y);
  80.  
  81. // subtract and round to 23 bit
  82. // this means making room in our 32bit representation
  83. result_mantissa = (mantissa(y) << 1) - ((mantissa(x) << 1) >> exp_difference);
  84. }
  85.  
  86. if (result_mantissa << 31) result_mantissa = ((result_mantissa >> 1) + 1);
  87. else result_mantissa = (result_mantissa >> 1);
  88.  
  89. // normalize mantissa
  90. uint32_t temp = result_mantissa << 9;
  91. for (uint32_t count = 0; count < 23; ++count) {
  92. if (!((temp << count) >> 31)) {
  93. result_mantissa <<= ++count; // leading 1, so shift 1 more time
  94. result_exponent -= count;
  95. break;
  96. }
  97. }
  98. }
  99. uint32_t result = result_sign << 31 | result_exponent << 23 | result_mantissa;
  100. return result;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement