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() {
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++) {
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);

View File

@@ -35,9 +35,13 @@ public class MathUtil {
}
public static BigDecimal simpleContinuedFraction(long[] nums) {
return simpleContinuedFraction(nums, 100);
}
public static BigDecimal simpleContinuedFraction(long[] nums, int scale) {
BigDecimal v = BigDecimal.ZERO;
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]));
}
@@ -52,15 +56,15 @@ public class MathUtil {
return BigDecimal.ZERO;
}
BigDecimal x = n.divide(new BigDecimal("2"), scale, RoundingMode.HALF_UP);
BigDecimal precision = new BigDecimal("1").movePointLeft(scale); // 誤差の許容範囲
BigDecimal x = n.divide(BigDecimal.valueOf(2), scale, RoundingMode.HALF_UP);
BigDecimal precision = BigDecimal.ONE.movePointLeft(scale); // 誤差の許容範囲
BigDecimal lastX;
do {
lastX = x;
x = n.divide(x, scale, RoundingMode.HALF_UP)
.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);
return x;

View File

@@ -4,6 +4,7 @@ import org.junit.Assert;
import org.junit.Test;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class MathUtilTest {
@@ -45,4 +46,24 @@ public class MathUtilTest {
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)
);
}
}