import java.
math.
{BigDecimal
=> JDecimal
} import java.
math.
RoundingMode.
_ import scala.
concurrent.
Future import scala.
concurrent.
ExecutionContext.
Implicits.
_ import scala.
concurrent.
duration.
_
def acotPrecision
(numDigits
: Int
)(x
: BigDecimal
) = { val two
= JDecimal.
valueOf(2) val unity
= JDecimal.
ONE.
setScale(numDigits, HALF
_EVEN
) var sum
= unity.
divide(x1, HALF
_EVEN
) var xpower
= new JDecimal
(sum.
toString)
var n
= JDecimal.
valueOf(3).
setScale(numDigits
) while (term.
setScale(numDigits, HALF
_EVEN
).
compareTo(JDecimal.
ZERO) != 0) { xpower = xpower.divide(xSquared, HALF_EVEN)
term = xpower.divide(n, HALF_EVEN)
sum
= if (add
) sum add term
else sum subtract term
add = !add
n = n add two
}
sum
}
def ePrecision
(numDigits
: Int
) = { var term
= JDecimal.
ONE.
setScale(numDigits, HALF
_EVEN
) var n
= JDecimal.
ONE.
setScale(numDigits, HALF
_EVEN
) while(term.
setScale(numDigits, HALF
_EVEN
).
compareTo(zero
) != 0) { sum = sum add term
term = term.divide(n, HALF_EVEN)
n = n add JDecimal.ONE
}
sum
}
val acot
= acotPrecision
(precision
) _
def d
(x
: Int
) = JDecimal.
valueOf(x
)
def piFuture
= Future
(d
(4) multiply
( (d(83) multiply acot(107)) add (d(17) multiply acot(1710)) subtract (d(22) multiply acot(103697))
subtract (d(24) multiply acot(2513489)) subtract (d(44) multiply acot(18280007883L))
add (d(12) multiply acot(7939642926390344818L))
add (d(22) multiply acot(BigDecimal("3054211727257704725384731479018")))
))
def eFuture
= Future
(ePrecision
(precision
))
Await.result(
e
<- eFuture
) yield println
((pi multiply e
).
setScale(precision -
10, DOWN
)) , 5 seconds)
}
ICAgIG9iamVjdCBNYWluIGV4dGVuZHMgQXBwIHsKICAgICAgaW1wb3J0IGphdmEubWF0aC57QmlnRGVjaW1hbCA9PiBKRGVjaW1hbH0KICAgICAgaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGUuXwogICAgICBpbXBvcnQgc2NhbGEuY29uY3VycmVudC5GdXR1cmUKICAgICAgaW1wb3J0IHNjYWxhLmNvbmN1cnJlbnQuQXdhaXQKICAgICAgaW1wb3J0IHNjYWxhLmNvbmN1cnJlbnQuRXhlY3V0aW9uQ29udGV4dC5JbXBsaWNpdHMuXwogICAgICBpbXBvcnQgc2NhbGEuY29uY3VycmVudC5kdXJhdGlvbi5fCiAgICAgIHZhbCBwcmVjaXNpb24gPSAxODAwCgogICAgICBkZWYgYWNvdFByZWNpc2lvbihudW1EaWdpdHM6IEludCkoeDogQmlnRGVjaW1hbCkgPSB7CiAgICAgICAgdmFsIHgxID0geC51bmRlcmx5aW5nCiAgICAgICAgdmFsIHR3byA9IEpEZWNpbWFsLnZhbHVlT2YoMikKICAgICAgICB2YWwgeFNxdWFyZWQgPSB4MSBwb3cgMgogICAgICAgIHZhbCB1bml0eSA9IEpEZWNpbWFsLk9ORS5zZXRTY2FsZShudW1EaWdpdHMsIEhBTEZfRVZFTikKICAgICAgICB2YXIgc3VtID0gdW5pdHkuZGl2aWRlKHgxLCBIQUxGX0VWRU4pCiAgICAgICAgdmFyIHhwb3dlciA9IG5ldyBKRGVjaW1hbChzdW0udG9TdHJpbmcpCiAgICAgICAgdmFyIHRlcm0gPSB1bml0eQoKICAgICAgICB2YXIgYWRkID0gZmFsc2UKCiAgICAgICAgdmFyIG4gPSBKRGVjaW1hbC52YWx1ZU9mKDMpLnNldFNjYWxlKG51bURpZ2l0cykKICAgICAgICB3aGlsZSAodGVybS5zZXRTY2FsZShudW1EaWdpdHMsIEhBTEZfRVZFTikuY29tcGFyZVRvKEpEZWNpbWFsLlpFUk8pICE9IDApIHsKICAgICAgICAgIHhwb3dlciA9IHhwb3dlci5kaXZpZGUoeFNxdWFyZWQsIEhBTEZfRVZFTikKICAgICAgICAgIHRlcm0gPSB4cG93ZXIuZGl2aWRlKG4sIEhBTEZfRVZFTikKICAgICAgICAgIHN1bSA9IGlmIChhZGQpIHN1bSBhZGQgdGVybSBlbHNlIHN1bSBzdWJ0cmFjdCB0ZXJtCiAgICAgICAgICBhZGQgPSAhYWRkCiAgICAgICAgICBuID0gbiBhZGQgdHdvCiAgICAgICAgfQogICAgICAgIHN1bQogICAgICB9CgogICAgICBkZWYgZVByZWNpc2lvbihudW1EaWdpdHM6IEludCkgPSB7CiAgICAgICAgdmFsIHplcm8gPSBKRGVjaW1hbC5aRVJPCiAgICAgICAgdmFyIHN1bSA9IHplcm8KICAgICAgICB2YXIgdGVybSA9IEpEZWNpbWFsLk9ORS5zZXRTY2FsZShudW1EaWdpdHMsIEhBTEZfRVZFTikKICAgICAgICB2YXIgbiA9IEpEZWNpbWFsLk9ORS5zZXRTY2FsZShudW1EaWdpdHMsIEhBTEZfRVZFTikKICAgICAgICB3aGlsZSh0ZXJtLnNldFNjYWxlKG51bURpZ2l0cywgSEFMRl9FVkVOKS5jb21wYXJlVG8oemVybykgIT0gMCkgewogICAgICAgICAgc3VtID0gc3VtIGFkZCB0ZXJtCiAgICAgICAgICB0ZXJtID0gdGVybS5kaXZpZGUobiwgSEFMRl9FVkVOKQogICAgICAgICAgbiA9IG4gYWRkIEpEZWNpbWFsLk9ORQogICAgICAgIH0KICAgICAgICBzdW0KICAgICAgfQoKICAgICAgdmFsIGFjb3QgPSBhY290UHJlY2lzaW9uKHByZWNpc2lvbikgXwoKICAgICAgZGVmIGQoeDogSW50KSA9IEpEZWNpbWFsLnZhbHVlT2YoeCkKCiAgICAgIGRlZiBwaUZ1dHVyZSA9IEZ1dHVyZShkKDQpIG11bHRpcGx5ICgKICAgICAgICAoZCg4MykgbXVsdGlwbHkgYWNvdCgxMDcpKSBhZGQgKGQoMTcpIG11bHRpcGx5IGFjb3QoMTcxMCkpIHN1YnRyYWN0IChkKDIyKSBtdWx0aXBseSBhY290KDEwMzY5NykpCiAgICAgICAgc3VidHJhY3QgKGQoMjQpIG11bHRpcGx5IGFjb3QoMjUxMzQ4OSkpIHN1YnRyYWN0IChkKDQ0KSBtdWx0aXBseSBhY290KDE4MjgwMDA3ODgzTCkpCiAgICAgICBhZGQgKGQoMTIpIG11bHRpcGx5IGFjb3QoNzkzOTY0MjkyNjM5MDM0NDgxOEwpKQogICAgICAgYWRkIChkKDIyKSBtdWx0aXBseSBhY290KEJpZ0RlY2ltYWwoIjMwNTQyMTE3MjcyNTc3MDQ3MjUzODQ3MzE0NzkwMTgiKSkpCiAgICAgICkpCgogICAgICBkZWYgZUZ1dHVyZSA9IEZ1dHVyZShlUHJlY2lzaW9uKHByZWNpc2lvbikpCgogICAgICBBd2FpdC5yZXN1bHQoCiAgICAgICAgZm9yIChwaSA8LSBwaUZ1dHVyZTsKICAgICAgICAgICAgIGUgPC0gZUZ1dHVyZSkgeWllbGQgcHJpbnRsbigocGkgbXVsdGlwbHkgZSkuc2V0U2NhbGUocHJlY2lzaW9uIC0gMTAsIERPV04pKQogICAgICAsIDUgc2Vjb25kcykgCiAgICB9