diff --git a/src/main/java/me/hatter/math/Sqrt10.java b/src/main/java/me/hatter/math/Sqrt10.java index 8ea86f3..5d46de3 100644 --- a/src/main/java/me/hatter/math/Sqrt10.java +++ b/src/main/java/me/hatter/math/Sqrt10.java @@ -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); diff --git a/src/main/java/me/hatter/math/util/MathUtil.java b/src/main/java/me/hatter/math/util/MathUtil.java index 33f61ea..31b1183 100644 --- a/src/main/java/me/hatter/math/util/MathUtil.java +++ b/src/main/java/me/hatter/math/util/MathUtil.java @@ -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; diff --git a/src/test/java/me/hatter/math/util/MathUtilTest.java b/src/test/java/me/hatter/math/util/MathUtilTest.java index 5bc499e..7571507 100644 --- a/src/test/java/me/hatter/math/util/MathUtilTest.java +++ b/src/test/java/me/hatter/math/util/MathUtilTest.java @@ -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) + ); + } }