Safe rounding to the next smaller

Consider:

int a, b;
int c = b * (a / b)

I think it should be pretty clear what it does for positive numbers: c is set to a multiple of b, which is less than a.

Example: let b = 2, then:

a = 0 => c = 0
a = 1 => c = 0
a = 2 => c = 2
a = 3 => c = 2

However, for negative numbers it works the opposite way: it takes the next larger (less negative) multiple of b. What is the best approach for choosing the next smaller (more negative) multiple of b?

+3
source share
3 answers

What about:

#include <cstdlib>
#include <iostream>

int round_down(int val, int unit) {
  std::div_t div_result = std::div(val, unit);
  int candidate = div_result.quot * unit;
  return candidate <= val ? candidate : 
         unit >= 0 ? candidate - unit :
         candidate + unit;
}

int main() {
  std::cout << round_down(9, 7) << std::endl;
  std::cout << round_down(13, 2) << std::endl;
  std::cout << round_down(15, 3) << std::endl;

  std::cout << round_down(-9, 7) << std::endl;
  std::cout << round_down(-13, 2) << std::endl;
  std::cout << round_down(-15, 3) << std::endl;

  std::cout << round_down(9, -7) << std::endl;
  std::cout << round_down(13, -2) << std::endl;
  std::cout << round_down(15, -3) << std::endl;

  std::cout << round_down(-9, -7) << std::endl;
  std::cout << round_down(-13, -2) << std::endl;
  std::cout << round_down(-15, -3) << std::endl;
}

, ++ 11 / . , std::div(). cppreference ( ):

/ ( ).
. , . ( ++ 11)
( ). ( ++ 11)
...
: ++ 11, % , , . The std:: div .

+4

b+1 a, a<0, :

#include <iostream>

using namespace std;
int main()
{
    cout << "---------------------------------" << endl;
    for (int bi = 1; bi < 10; bi++)
    {
        for (int ai = -10; ai < 10; ai++)
        {
            int a = ai;
            int b = bi;

            if (a < 0)
                a -= b + 1;

            int c = b * (std::div(a / b));
            cout << "a = " << a << ",b = " << b << " => c = " << c << endl;
        }
        cout << "---------------------------------" << endl;
    }
}

:

---------------------------------
a = -12,b = 1 => c = -12
a = -11,b = 1 => c = -11
a = -10,b = 1 => c = -10
a = -9,b = 1 => c = -9
a = -8,b = 1 => c = -8
a = -7,b = 1 => c = -7
a = -6,b = 1 => c = -6
a = -5,b = 1 => c = -5
a = -4,b = 1 => c = -4
a = -3,b = 1 => c = -3
a = 0,b = 1 => c = 0
a = 1,b = 1 => c = 1
a = 2,b = 1 => c = 2
a = 3,b = 1 => c = 3
a = 4,b = 1 => c = 4
a = 5,b = 1 => c = 5
a = 6,b = 1 => c = 6
a = 7,b = 1 => c = 7
a = 8,b = 1 => c = 8
a = 9,b = 1 => c = 9
---------------------------------
a = -13,b = 2 => c = -12
a = -12,b = 2 => c = -12
a = -11,b = 2 => c = -10
a = -10,b = 2 => c = -10
a = -9,b = 2 => c = -8
a = -8,b = 2 => c = -8
a = -7,b = 2 => c = -6
a = -6,b = 2 => c = -6
a = -5,b = 2 => c = -4
a = -4,b = 2 => c = -4
a = 0,b = 2 => c = 0
a = 1,b = 2 => c = 0
a = 2,b = 2 => c = 2
a = 3,b = 2 => c = 2
a = 4,b = 2 => c = 4
a = 5,b = 2 => c = 4
a = 6,b = 2 => c = 6
a = 7,b = 2 => c = 6
a = 8,b = 2 => c = 8
a = 9,b = 2 => c = 8
---------------------------------
a = -14,b = 3 => c = -12
a = -13,b = 3 => c = -12
a = -12,b = 3 => c = -12
a = -11,b = 3 => c = -9
a = -10,b = 3 => c = -9
a = -9,b = 3 => c = -9
a = -8,b = 3 => c = -6
a = -7,b = 3 => c = -6
a = -6,b = 3 => c = -6
a = -5,b = 3 => c = -3
a = 0,b = 3 => c = 0
a = 1,b = 3 => c = 0
a = 2,b = 3 => c = 0
a = 3,b = 3 => c = 3
a = 4,b = 3 => c = 3
a = 5,b = 3 => c = 3
a = 6,b = 3 => c = 6
a = 7,b = 3 => c = 6
a = 8,b = 3 => c = 6
a = 9,b = 3 => c = 9
---------------------------------
a = -15,b = 4 => c = -12
a = -14,b = 4 => c = -12
a = -13,b = 4 => c = -12
a = -12,b = 4 => c = -12
a = -11,b = 4 => c = -8
a = -10,b = 4 => c = -8
a = -9,b = 4 => c = -8
a = -8,b = 4 => c = -8
a = -7,b = 4 => c = -4
a = -6,b = 4 => c = -4
a = 0,b = 4 => c = 0
a = 1,b = 4 => c = 0
a = 2,b = 4 => c = 0
a = 3,b = 4 => c = 0
a = 4,b = 4 => c = 4
a = 5,b = 4 => c = 4
a = 6,b = 4 => c = 4
a = 7,b = 4 => c = 4
a = 8,b = 4 => c = 8
a = 9,b = 4 => c = 8
---------------------------------
a = -16,b = 5 => c = -15
a = -15,b = 5 => c = -15
a = -14,b = 5 => c = -10
a = -13,b = 5 => c = -10
a = -12,b = 5 => c = -10
a = -11,b = 5 => c = -10
a = -10,b = 5 => c = -10
a = -9,b = 5 => c = -5
a = -8,b = 5 => c = -5
a = -7,b = 5 => c = -5
a = 0,b = 5 => c = 0
a = 1,b = 5 => c = 0
a = 2,b = 5 => c = 0
a = 3,b = 5 => c = 0
a = 4,b = 5 => c = 0
a = 5,b = 5 => c = 5
a = 6,b = 5 => c = 5
a = 7,b = 5 => c = 5
a = 8,b = 5 => c = 5
a = 9,b = 5 => c = 5
---------------------------------
a = -17,b = 6 => c = -12
a = -16,b = 6 => c = -12
a = -15,b = 6 => c = -12
a = -14,b = 6 => c = -12
a = -13,b = 6 => c = -12
a = -12,b = 6 => c = -12
a = -11,b = 6 => c = -6
a = -10,b = 6 => c = -6
a = -9,b = 6 => c = -6
a = -8,b = 6 => c = -6
a = 0,b = 6 => c = 0
a = 1,b = 6 => c = 0
a = 2,b = 6 => c = 0
a = 3,b = 6 => c = 0
a = 4,b = 6 => c = 0
a = 5,b = 6 => c = 0
a = 6,b = 6 => c = 6
a = 7,b = 6 => c = 6
a = 8,b = 6 => c = 6
a = 9,b = 6 => c = 6
---------------------------------
a = -18,b = 7 => c = -14
a = -17,b = 7 => c = -14
a = -16,b = 7 => c = -14
a = -15,b = 7 => c = -14
a = -14,b = 7 => c = -14
a = -13,b = 7 => c = -7
a = -12,b = 7 => c = -7
a = -11,b = 7 => c = -7
a = -10,b = 7 => c = -7
a = -9,b = 7 => c = -7
a = 0,b = 7 => c = 0
a = 1,b = 7 => c = 0
a = 2,b = 7 => c = 0
a = 3,b = 7 => c = 0
a = 4,b = 7 => c = 0
a = 5,b = 7 => c = 0
a = 6,b = 7 => c = 0
a = 7,b = 7 => c = 7
a = 8,b = 7 => c = 7
a = 9,b = 7 => c = 7
---------------------------------
a = -19,b = 8 => c = -16
a = -18,b = 8 => c = -16
a = -17,b = 8 => c = -16
a = -16,b = 8 => c = -16
a = -15,b = 8 => c = -8
a = -14,b = 8 => c = -8
a = -13,b = 8 => c = -8
a = -12,b = 8 => c = -8
a = -11,b = 8 => c = -8
a = -10,b = 8 => c = -8
a = 0,b = 8 => c = 0
a = 1,b = 8 => c = 0
a = 2,b = 8 => c = 0
a = 3,b = 8 => c = 0
a = 4,b = 8 => c = 0
a = 5,b = 8 => c = 0
a = 6,b = 8 => c = 0
a = 7,b = 8 => c = 0
a = 8,b = 8 => c = 8
a = 9,b = 8 => c = 8
---------------------------------
a = -20,b = 9 => c = -18
a = -19,b = 9 => c = -18
a = -18,b = 9 => c = -18
a = -17,b = 9 => c = -9
a = -16,b = 9 => c = -9
a = -15,b = 9 => c = -9
a = -14,b = 9 => c = -9
a = -13,b = 9 => c = -9
a = -12,b = 9 => c = -9
a = -11,b = 9 => c = -9
a = 0,b = 9 => c = 0
a = 1,b = 9 => c = 0
a = 2,b = 9 => c = 0
a = 3,b = 9 => c = 0
a = 4,b = 9 => c = 0
a = 5,b = 9 => c = 0
a = 6,b = 9 => c = 0
a = 7,b = 9 => c = 0
a = 8,b = 9 => c = 0
a = 9,b = 9 => c = 9
---------------------------------
+1

, , . , m n , :

- (m)/n = - (m/n)

, , :

a = -1 => c = -2
a = -2 => c = -2
a = -3 => c = -4
a = -4 => c = -4
a = -5 => c = -6

, , . , , - . , , . :

int c = b * floor((double)a / (double)b);

, .

0

Source: https://habr.com/ru/post/1617743/


All Articles