feat: add test case

This commit is contained in:
2025-07-22 00:20:08 +08:00
parent beac626679
commit 0d6eed0568
3 changed files with 31 additions and 6 deletions

View File

@@ -23,10 +23,10 @@ public class Sqrt10 {
// } // }
//} //}
public static BigDecimal sqrt10() { public static BigDecimal sqrt10() {
BigDecimal x = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(6), 100, RoundingMode.FLOOR); BigDecimal x = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(6), 100, RoundingMode.HALF_UP);
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
x = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(6).add(x), 100, RoundingMode.FLOOR); x = BigDecimal.valueOf(1).divide(BigDecimal.valueOf(6).add(x), 100, RoundingMode.HALF_UP);
} }
return BigDecimal.valueOf(3).add(x); return BigDecimal.valueOf(3).add(x);

View File

@@ -35,9 +35,13 @@ public class MathUtil {
} }
public static BigDecimal simpleContinuedFraction(long[] nums) { public static BigDecimal simpleContinuedFraction(long[] nums) {
return simpleContinuedFraction(nums, 100);
}
public static BigDecimal simpleContinuedFraction(long[] nums, int scale) {
BigDecimal v = BigDecimal.ZERO; BigDecimal v = BigDecimal.ZERO;
for (int i = nums.length - 1; i > 0; i--) { for (int i = nums.length - 1; i > 0; i--) {
v = BigDecimal.ONE.divide(v.add(BigDecimal.valueOf(nums[i])), 100, RoundingMode.FLOOR); v = BigDecimal.ONE.divide(v.add(BigDecimal.valueOf(nums[i])), scale, RoundingMode.HALF_UP);
} }
return v.add(BigDecimal.valueOf(nums[0])); return v.add(BigDecimal.valueOf(nums[0]));
} }
@@ -52,15 +56,15 @@ public class MathUtil {
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
BigDecimal x = n.divide(new BigDecimal("2"), scale, RoundingMode.HALF_UP); BigDecimal x = n.divide(BigDecimal.valueOf(2), scale, RoundingMode.HALF_UP);
BigDecimal precision = new BigDecimal("1").movePointLeft(scale); // 誤差の許容範囲 BigDecimal precision = BigDecimal.ONE.movePointLeft(scale); // 誤差の許容範囲
BigDecimal lastX; BigDecimal lastX;
do { do {
lastX = x; lastX = x;
x = n.divide(x, scale, RoundingMode.HALF_UP) x = n.divide(x, scale, RoundingMode.HALF_UP)
.add(x) .add(x)
.divide(new BigDecimal("2"), scale, RoundingMode.HALF_UP); .divide(BigDecimal.valueOf(2), scale, RoundingMode.HALF_UP);
} while (x.subtract(lastX).abs().compareTo(precision) > 0); } while (x.subtract(lastX).abs().compareTo(precision) > 0);
return x; return x;

View File

@@ -4,6 +4,7 @@ import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
public class MathUtilTest { public class MathUtilTest {
@@ -45,4 +46,24 @@ public class MathUtilTest {
MathUtil.simpleContinuedFraction(new long[]{3, 7, 16, 1, 3, 4, 2, 3, 1}) MathUtil.simpleContinuedFraction(new long[]{3, 7, 16, 1, 3, 4, 2, 3, 1})
)); ));
} }
@Test
public void testSqrt() {
Assert.assertEquals(
new BigDecimal("3.1622776601683793319988935444327185337195551393252168268575048527925944386392382213442481083793002952"),
MathUtil.sqrt(BigDecimal.valueOf(10), 100)
);
Assert.assertEquals(
MathUtil.simpleContinuedFraction(new long[]{1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}),
MathUtil.sqrt(BigDecimal.valueOf(2), 110).setScale(100, RoundingMode.HALF_UP)
);
Assert.assertEquals(
MathUtil.simpleContinuedFraction(new long[]{3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}),
MathUtil.sqrt(BigDecimal.valueOf(10), 100)
);
}
} }