Skip to content

Commit 179d2f1

Browse files
committed
Simplify ceil division
1 parent 7257358 commit 179d2f1

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

MLAPI.Tests/NetworkingManagerComponents/Binary/ArithmeticTest.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,14 @@ public void testCeil()
1515
{
1616
Assert.That(Arithmetic.CeilingExact(10, 5), Is.EqualTo(2));
1717
Assert.That(Arithmetic.CeilingExact(11, 5), Is.EqualTo(3));
18-
Assert.That(Arithmetic.CeilingExact(-5, 5), Is.EqualTo(-1));
19-
Assert.That(Arithmetic.CeilingExact(-4, 5), Is.EqualTo(-1));
18+
Assert.That(Arithmetic.CeilingExact(0, 5), Is.EqualTo(0));
19+
Assert.That(Arithmetic.CeilingExact(1, 5), Is.EqualTo(1));
20+
Assert.That(Arithmetic.CeilingExact(2, 5), Is.EqualTo(1));
21+
Assert.That(Arithmetic.CeilingExact(3, 5), Is.EqualTo(1));
22+
Assert.That(Arithmetic.CeilingExact(4, 5), Is.EqualTo(1));
23+
Assert.That(Arithmetic.CeilingExact(5, 5), Is.EqualTo(1));
24+
Assert.That(Arithmetic.CeilingExact(6, 5), Is.EqualTo(2));
25+
2026
}
2127

2228
[Test]

MLAPI/NetworkingManagerComponents/Binary/Arithmetic.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ public static class Arithmetic
1010
public const sbyte SIGN_BIT_8 = -128;
1111

1212
// Ceiling function that doesn't deal with floating point values
13-
public static ulong CeilingExact(ulong u1, ulong u2) => (u1 / u2) + (u1 % u2 == 0 ? 0UL : 1UL);
14-
public static long CeilingExact(long u1, long u2) => (u1 / u2) + (u1 % u2 == 0 ? 0L : 1L | (((u1 & SIGN_BIT_64) ^ (u2 & SIGN_BIT_64))>>62));
15-
public static uint CeilingExact(uint u1, uint u2) => (u1 / u2) + (u1 % u2 == 0 ? 0U : 1U);
16-
public static int CeilingExact(int u1, int u2) => (u1 / u2) + (u1 % u2 == 0 ? 0 : 1 | (((u1 & SIGN_BIT_32) ^ (u2 & SIGN_BIT_32)) >> 30));
17-
public static ushort CeilingExact(ushort u1, ushort u2) => (ushort)((u1 / u2) + (u1 % u2 == 0 ? 0 : 1));
18-
public static short CeilingExact(short u1, short u2) => (short)((u1 / u2) + (u1 % u2 == 0 ? 0 : 1 | (((u1 & SIGN_BIT_32) ^ (u2 & SIGN_BIT_32)) >> 30)));
19-
public static byte CeilingExact(byte u1, byte u2) => (byte)((u1 / u2) + (u1 % u2 == 0 ? 0 : 1));
20-
public static sbyte CeilingExact(sbyte u1, sbyte u2) => (sbyte)((u1 / u2) + (u1 % u2 == 0 ? 0 : 1 | (((u1 & SIGN_BIT_32) ^ (u2 & SIGN_BIT_32)) >> 30)));
13+
// these only work correctly with possitive numbers
14+
public static ulong CeilingExact(ulong u1, ulong u2) => (u1 + u2 - 1) / u2;
15+
public static long CeilingExact(long u1, long u2) => (u1 + u2 - 1) / u2;
16+
public static uint CeilingExact(uint u1, uint u2) => (u1 + u2 - 1) / u2;
17+
public static int CeilingExact(int u1, int u2) => (u1 + u2 - 1) / u2;
18+
public static ushort CeilingExact(ushort u1, ushort u2) => (ushort)((u1 + u2 - 1) / u2);
19+
public static short CeilingExact(short u1, short u2) => (short)((u1 + u2 - 1) / u2);
20+
public static byte CeilingExact(byte u1, byte u2) => (byte)((u1 + u2 - 1) / u2);
21+
public static sbyte CeilingExact(sbyte u1, sbyte u2) => (sbyte)((u1 + u2 - 1) / u2);
2122

2223
/// <summary>
2324
/// ZigZag encodes a signed integer and maps it to a unsigned integer

0 commit comments

Comments
 (0)