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