math_utils.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) 2011, Tom Distler (http://tdistler.com)
  3. * All rights reserved.
  4. *
  5. * The BSD License
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * - Redistributions of source code must retain the above copyright notice,
  11. * this list of conditions and the following disclaimer.
  12. *
  13. * - Redistributions in binary form must reproduce the above copyright notice,
  14. * this list of conditions and the following disclaimer in the documentation
  15. * and/or other materials provided with the distribution.
  16. *
  17. * - Neither the name of the tdistler.com nor the names of its contributors may
  18. * be used to endorse or promote products derived from this software without
  19. * specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  25. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  26. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  27. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  28. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  29. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  30. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. * POSSIBILITY OF SUCH DAMAGE.
  32. */
  33. #include "math_utils.h"
  34. #include <math.h>
  35. int _round(float a)
  36. {
  37. int sign_a = a > 0.0f ? 1 : -1;
  38. return a-(int)a >= 0.5 ? (int)a + sign_a : (int)a;
  39. }
  40. int _max(int x, int y)
  41. {
  42. return x >= y ? x : y;
  43. }
  44. int _min(int x, int y)
  45. {
  46. return x <= y ? x : y;
  47. }
  48. int _cmp_float(float a, float b, int digits)
  49. {
  50. /* Round */
  51. int sign_a = a > 0.0f ? 1 : -1;
  52. int sign_b = b > 0.0f ? 1 : -1;
  53. double scale = pow(10.0, (double)digits);
  54. double ax = a * scale;
  55. double bx = b * scale;
  56. int ai = ax-(int)ax >= 0.5 ? (int)ax + sign_a : (int)ax;
  57. int bi = bx-(int)bx >= 0.5 ? (int)bx + sign_b : (int)bx;
  58. /* Compare */
  59. return ai == bi ? 0 : 1;
  60. }
  61. int _matrix_cmp(const float *a, const float *b, int w, int h, int digits)
  62. {
  63. int offset;
  64. int result=0;
  65. int len=w*h;
  66. for (offset=0; offset<len; ++offset) {
  67. if (_cmp_float(a[offset], b[offset], digits)) {
  68. result = 1;
  69. break;
  70. }
  71. }
  72. return result;
  73. }