This is an automated email from the ASF dual-hosted git repository.
garydgregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new e992a498d LANG-1834 Fix Fraction reduction for Integer.MIN_VALUE
(#1794)
e992a498d is described below
commit e992a498d711fc4302d5ad89e80511db41db2f11
Author: Indy <[email protected]>
AuthorDate: Sat Sep 19 01:37:24 2026 +0530
LANG-1834 Fix Fraction reduction for Integer.MIN_VALUE (#1794)
---
.../org/apache/commons/lang3/math/Fraction.java | 4 ++--
.../apache/commons/lang3/math/FractionTest.java | 24 ++++++++++++++++++++++
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/commons/lang3/math/Fraction.java
b/src/main/java/org/apache/commons/lang3/math/Fraction.java
index 3ba548fac..a57845dd2 100644
--- a/src/main/java/org/apache/commons/lang3/math/Fraction.java
+++ b/src/main/java/org/apache/commons/lang3/math/Fraction.java
@@ -328,8 +328,8 @@ public static Fraction getReducedFraction(int numerator,
int denominator) {
if (numerator == 0) {
return ZERO; // normalize zero.
}
- // allow 2^k/-2^31 as a valid fraction (where k>0)
- if (denominator == Integer.MIN_VALUE && (numerator & 1) == 0) {
+ // Reduce common powers of two before sign normalization to avoid
negating Integer.MIN_VALUE.
+ while ((numerator & 1) == 0 && (denominator & 1) == 0) {
numerator /= 2;
denominator /= 2;
}
diff --git a/src/test/java/org/apache/commons/lang3/math/FractionTest.java
b/src/test/java/org/apache/commons/lang3/math/FractionTest.java
index 7affb71cd..aac15b782 100644
--- a/src/test/java/org/apache/commons/lang3/math/FractionTest.java
+++ b/src/test/java/org/apache/commons/lang3/math/FractionTest.java
@@ -1114,6 +1114,30 @@ void testReducedFactory_int_int() {
assertEquals(1, f.getDenominator());
}
+ @Test
+ void testReducedFactoryIntegerMinValue() {
+ Fraction f = Fraction.getReducedFraction(Integer.MIN_VALUE, -2);
+ assertEquals(1073741824, f.getNumerator());
+ assertEquals(1, f.getDenominator());
+
+ f = Fraction.getReducedFraction(Integer.MIN_VALUE, -6);
+ assertEquals(1073741824, f.getNumerator());
+ assertEquals(3, f.getDenominator());
+
+ f = Fraction.getReducedFraction(Integer.MIN_VALUE, Integer.MIN_VALUE);
+ assertEquals(1, f.getNumerator());
+ assertEquals(1, f.getDenominator());
+
+ assertThrows(ArithmeticException.class, () ->
Fraction.getReducedFraction(Integer.MIN_VALUE, -1));
+ assertThrows(ArithmeticException.class, () ->
Fraction.getReducedFraction(Integer.MIN_VALUE, -3));
+
+ f = Fraction.getReducedFraction(-2, Integer.MIN_VALUE);
+ assertEquals(1, f.getNumerator());
+ assertEquals(1073741824, f.getDenominator());
+
+ assertThrows(ArithmeticException.class, () ->
Fraction.getReducedFraction(-7, Integer.MIN_VALUE));
+ }
+
@Test
void testSubtract() {
Fraction f;