feat: add test case
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user