fixes
This commit is contained in:
6
.idea/copilot.data.migration.ask.xml
generated
Normal file
6
.idea/copilot.data.migration.ask.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="AskMigrationStateService">
|
||||||
|
<option name="migrationStatus" value="COMPLETED" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
21
output.csv
Normal file
21
output.csv
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
X;f(X)
|
||||||
|
-1.0;-0.5869665480423778
|
||||||
|
-0.9;-0.9352384029718002
|
||||||
|
-0.8;-1.4961760304210368
|
||||||
|
-0.7000000000000001;-2.6709130967375065
|
||||||
|
-0.6000000000000001;-7.731313457128241
|
||||||
|
-0.5000000000000001;10.536936447964717
|
||||||
|
-0.40000000000000013;3.2217613031197727
|
||||||
|
-0.30000000000000016;1.92971965792051
|
||||||
|
-0.20000000000000015;1.4064231946343844
|
||||||
|
-0.10000000000000014;1.1414743318601792
|
||||||
|
0.09999999999999987;5.6049822447303335
|
||||||
|
0.19999999999999987;0.6792599777698426
|
||||||
|
0.2999999999999999;0.06689887171282584
|
||||||
|
0.3999999999999999;-0.02176594607783879
|
||||||
|
0.4999999999999999;-0.02248614282716569
|
||||||
|
0.5999999999999999;-0.012196322980954091
|
||||||
|
0.6999999999999998;-0.0048145086174475014
|
||||||
|
0.7999999999999998;-0.0012728922251139007
|
||||||
|
0.8999999999999998;-1.3893249002483576E-4
|
||||||
|
0.9999999999999998;NaN
|
||||||
|
62
src/main/kotlin/function/FunctionSystem.kt
Normal file
62
src/main/kotlin/function/FunctionSystem.kt
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
package function
|
||||||
|
|
||||||
|
import function.base.ILn
|
||||||
|
import function.base.ISin
|
||||||
|
import function.logarithmic.ILog
|
||||||
|
import function.trigonometric.ICos
|
||||||
|
import function.trigonometric.ICot
|
||||||
|
import function.trigonometric.ICsc
|
||||||
|
import function.trigonometric.ISec
|
||||||
|
import kotlin.math.pow
|
||||||
|
|
||||||
|
class FunctionSystem(
|
||||||
|
private val sinImpl: ISin,
|
||||||
|
private val lnImpl: ILn,
|
||||||
|
private val cosImpl: ICos,
|
||||||
|
private val cscImpl: ICsc,
|
||||||
|
private val secImpl: ISec,
|
||||||
|
private val cotImpl: ICot,
|
||||||
|
private val logImpl: ILog,
|
||||||
|
) {
|
||||||
|
fun compute(
|
||||||
|
x: Double,
|
||||||
|
eps: Double = 1e-10,
|
||||||
|
): Double =
|
||||||
|
if (x <= 0) {
|
||||||
|
computeTrigPart(x, eps)
|
||||||
|
} else {
|
||||||
|
computeLogPart(x, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun computeTrigPart(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
val sinX = sinImpl.sin(x, eps)
|
||||||
|
val cscX = cscImpl.csc(x, eps)
|
||||||
|
val secX = secImpl.sec(x, eps)
|
||||||
|
val cosX = cosImpl.cos(x, eps)
|
||||||
|
val cotX = cotImpl.cot(x, eps)
|
||||||
|
|
||||||
|
val numerator = (sinX + cscX).pow(2) / cscX
|
||||||
|
val denominator = secX.pow(3) + cosX.pow(2) * (sinX + cotX)
|
||||||
|
|
||||||
|
return numerator / denominator
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun computeLogPart(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
val log10X = logImpl.log(10.0, x, eps)
|
||||||
|
val log5X = logImpl.log(5.0, x, eps)
|
||||||
|
val log3X = logImpl.log(3.0, x, eps)
|
||||||
|
val log2X = logImpl.log(2.0, x, eps)
|
||||||
|
val lnX = lnImpl.ln(x, eps)
|
||||||
|
|
||||||
|
val leftPart = log10X / log5X * log10X * log10X * log3X
|
||||||
|
val rightPart = (log2X / log2X).pow(3) - (log3X * lnX + log5X - log5X)
|
||||||
|
|
||||||
|
return leftPart * rightPart
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/main/kotlin/function/base/ILn.kt
Normal file
5
src/main/kotlin/function/base/ILn.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package function.base
|
||||||
|
|
||||||
|
interface ILn {
|
||||||
|
fun ln(x: Double, eps: Double = 1e-10): Double
|
||||||
|
}
|
||||||
5
src/main/kotlin/function/base/ISin.kt
Normal file
5
src/main/kotlin/function/base/ISin.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package function.base
|
||||||
|
|
||||||
|
interface ISin {
|
||||||
|
fun sin(x: Double, eps: Double = 1e-10): Double
|
||||||
|
}
|
||||||
22
src/main/kotlin/function/base/LnTaylor.kt
Normal file
22
src/main/kotlin/function/base/LnTaylor.kt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
package function.base
|
||||||
|
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
class LnTaylor : ILn {
|
||||||
|
override fun ln(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
if (x <= 0) throw IllegalArgumentException("Ln is undefined for x <= 0")
|
||||||
|
val y = (x - 1) / (x + 1)
|
||||||
|
var result = 0.0
|
||||||
|
var term = y
|
||||||
|
var k = 1
|
||||||
|
while (abs(term) >= eps) {
|
||||||
|
result += term / (2 * k - 1)
|
||||||
|
term *= y * y
|
||||||
|
k++
|
||||||
|
}
|
||||||
|
return 2 * result
|
||||||
|
}
|
||||||
|
}
|
||||||
21
src/main/kotlin/function/base/SinTaylor.kt
Normal file
21
src/main/kotlin/function/base/SinTaylor.kt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package function.base
|
||||||
|
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
class SinTaylor : ISin {
|
||||||
|
override fun sin(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
var result = 0.0
|
||||||
|
var term = x
|
||||||
|
var n = 1
|
||||||
|
while (abs(term) >= eps) {
|
||||||
|
result += term
|
||||||
|
term *= -x * x / ((2 * n) * (2 * n + 1))
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/main/kotlin/function/logarithmic/ILog.kt
Normal file
5
src/main/kotlin/function/logarithmic/ILog.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package function.logarithmic
|
||||||
|
|
||||||
|
interface ILog {
|
||||||
|
fun log(base: Double, x: Double, eps: Double = 1e-10): Double
|
||||||
|
}
|
||||||
13
src/main/kotlin/function/logarithmic/Log.kt
Normal file
13
src/main/kotlin/function/logarithmic/Log.kt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package function.logarithmic
|
||||||
|
|
||||||
|
import function.base.ILn
|
||||||
|
|
||||||
|
class Log(private val lnImpl: ILn) : ILog {
|
||||||
|
override fun log(base: Double, x: Double, eps: Double): Double {
|
||||||
|
if (base <= 0 || base == 1.0) throw IllegalArgumentException("Log base must be > 0 and != 1")
|
||||||
|
if (x <= 0) throw IllegalArgumentException("Log argument must be > 0")
|
||||||
|
val lnX = lnImpl.ln(x, eps)
|
||||||
|
val lnBase = lnImpl.ln(base, eps)
|
||||||
|
return lnX / lnBase
|
||||||
|
}
|
||||||
|
}
|
||||||
10
src/main/kotlin/function/stubs/CosStub.kt
Normal file
10
src/main/kotlin/function/stubs/CosStub.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.trigonometric.ICos
|
||||||
|
|
||||||
|
class CosStub : ICos {
|
||||||
|
override fun cos(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
10
src/main/kotlin/function/stubs/CotStub.kt
Normal file
10
src/main/kotlin/function/stubs/CotStub.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.trigonometric.ICot
|
||||||
|
|
||||||
|
class CotStub : ICot {
|
||||||
|
override fun cot(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
10
src/main/kotlin/function/stubs/CscStub.kt
Normal file
10
src/main/kotlin/function/stubs/CscStub.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.trigonometric.ICsc
|
||||||
|
|
||||||
|
class CscStub : ICsc {
|
||||||
|
override fun csc(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
10
src/main/kotlin/function/stubs/LnStub.kt
Normal file
10
src/main/kotlin/function/stubs/LnStub.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.base.ILn
|
||||||
|
|
||||||
|
class LnStub : ILn {
|
||||||
|
override fun ln(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
11
src/main/kotlin/function/stubs/LogStub.kt
Normal file
11
src/main/kotlin/function/stubs/LogStub.kt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.logarithmic.ILog
|
||||||
|
|
||||||
|
class LogStub : ILog {
|
||||||
|
override fun log(
|
||||||
|
base: Double,
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
10
src/main/kotlin/function/stubs/SecStub.kt
Normal file
10
src/main/kotlin/function/stubs/SecStub.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.trigonometric.ISec
|
||||||
|
|
||||||
|
class SecStub : ISec {
|
||||||
|
override fun sec(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
10
src/main/kotlin/function/stubs/SinStub.kt
Normal file
10
src/main/kotlin/function/stubs/SinStub.kt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package function.stubs
|
||||||
|
|
||||||
|
import function.base.ISin
|
||||||
|
|
||||||
|
class SinStub : ISin {
|
||||||
|
override fun sin(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double = 1.0
|
||||||
|
}
|
||||||
9
src/main/kotlin/function/trigonometric/Cos.kt
Normal file
9
src/main/kotlin/function/trigonometric/Cos.kt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package function.trigonometric
|
||||||
|
|
||||||
|
import function.base.ISin
|
||||||
|
|
||||||
|
class Cos(private val sinImpl: ISin) : ICos {
|
||||||
|
override fun cos(x: Double, eps: Double): Double {
|
||||||
|
return sinImpl.sin(x + Math.PI / 2, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/main/kotlin/function/trigonometric/Cot.kt
Normal file
20
src/main/kotlin/function/trigonometric/Cot.kt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package function.trigonometric
|
||||||
|
|
||||||
|
import function.base.ISin
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
class Cot(
|
||||||
|
private val sinImpl: ISin,
|
||||||
|
) : ICot {
|
||||||
|
private val cosImpl = Cos(sinImpl)
|
||||||
|
|
||||||
|
override fun cot(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
val sinVal = sinImpl.sin(x, eps)
|
||||||
|
val cosVal = cosImpl.cos(x, eps)
|
||||||
|
if (abs(sinVal) < 1e-8) throw ArithmeticException("Cot is undefined for sin(x) = 0")
|
||||||
|
return cosVal / sinVal
|
||||||
|
}
|
||||||
|
}
|
||||||
17
src/main/kotlin/function/trigonometric/Csc.kt
Normal file
17
src/main/kotlin/function/trigonometric/Csc.kt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package function.trigonometric
|
||||||
|
|
||||||
|
import function.base.ISin
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
class Csc(
|
||||||
|
private val sinImpl: ISin,
|
||||||
|
) : ICsc {
|
||||||
|
override fun csc(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
val sinVal = sinImpl.sin(x, eps)
|
||||||
|
if (abs(sinVal) < 1e-8) throw ArithmeticException("Csc is undefined for sin(x) = 0")
|
||||||
|
return 1.0 / sinVal
|
||||||
|
}
|
||||||
|
}
|
||||||
5
src/main/kotlin/function/trigonometric/ICos.kt
Normal file
5
src/main/kotlin/function/trigonometric/ICos.kt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package function.trigonometric
|
||||||
|
|
||||||
|
interface ICos {
|
||||||
|
fun cos(x: Double, eps: Double = 1e-10): Double
|
||||||
|
}
|
||||||
19
src/main/kotlin/function/trigonometric/Sec.kt
Normal file
19
src/main/kotlin/function/trigonometric/Sec.kt
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package function.trigonometric
|
||||||
|
|
||||||
|
import function.base.ISin
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
class Sec(
|
||||||
|
sinImpl: ISin,
|
||||||
|
) : ISec {
|
||||||
|
private val cosImpl = Cos(sinImpl)
|
||||||
|
|
||||||
|
override fun sec(
|
||||||
|
x: Double,
|
||||||
|
eps: Double,
|
||||||
|
): Double {
|
||||||
|
val cosVal = cosImpl.cos(x, eps)
|
||||||
|
if (abs(cosVal) < 1e-8) throw ArithmeticException("Sec is undefined for cos(x) = 0")
|
||||||
|
return 1.0 / cosVal
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/main/kotlin/util/CsvWriter.kt
Normal file
18
src/main/kotlin/util/CsvWriter.kt
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
class CsvWriter {
|
||||||
|
fun writeToCsv(
|
||||||
|
filename: String,
|
||||||
|
data: List<Pair<Double, Double>>,
|
||||||
|
label: String = "Result",
|
||||||
|
) {
|
||||||
|
File(filename).printWriter().use { out ->
|
||||||
|
out.println("X;$label(X)")
|
||||||
|
for ((x, result) in data) {
|
||||||
|
out.println("$x;$result")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/test/kotlin/CosTest.kt
Normal file
36
src/test/kotlin/CosTest.kt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import function.trigonometric.Cos
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.cos
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class CosTest {
|
||||||
|
private val cosImpl = Cos(SinTaylor())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCosZero() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val result = cosImpl.cos(0.0, eps)
|
||||||
|
assertEquals(cos(0.0), result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCosPi() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = PI
|
||||||
|
val result = cosImpl.cos(x, eps)
|
||||||
|
assertEquals(cos(x), result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCosPiOver2() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = PI / 2
|
||||||
|
val expected = cos(x)
|
||||||
|
val result = cosImpl.cos(x, eps)
|
||||||
|
assertEquals(expected, result, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
39
src/test/kotlin/CotTest.kt
Normal file
39
src/test/kotlin/CotTest.kt
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import function.trigonometric.Cot
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.cos
|
||||||
|
import kotlin.math.sin
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
class CotTest {
|
||||||
|
private val cotImpl = Cot(SinTaylor())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCot() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 1.0
|
||||||
|
val result = cotImpl.cot(x, eps)
|
||||||
|
assertTrue(result.isFinite())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCotInvalid() {
|
||||||
|
val eps = 1e-10
|
||||||
|
assertFailsWith<ArithmeticException> {
|
||||||
|
cotImpl.cot(0.0, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCotPiOver4() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = PI / 4
|
||||||
|
val result = cotImpl.cot(x, eps)
|
||||||
|
assertEquals(cos(x) / sin(x), result, eps * 10)
|
||||||
|
}
|
||||||
|
}
|
||||||
29
src/test/kotlin/CscTest.kt
Normal file
29
src/test/kotlin/CscTest.kt
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import function.trigonometric.Csc
|
||||||
|
import integration.eps
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.sin
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
|
class CscTest {
|
||||||
|
private val cscImpl = Csc(SinTaylor())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCscPiOver2() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = PI / 2
|
||||||
|
val result = cscImpl.csc(x, eps)
|
||||||
|
assertEquals(1.0 / sin(x), result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testCscInvalid() {
|
||||||
|
assertFailsWith<ArithmeticException> {
|
||||||
|
cscImpl.csc(0.0, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
src/test/kotlin/FunctionSystemTest.kt
Normal file
58
src/test/kotlin/FunctionSystemTest.kt
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.FunctionSystem
|
||||||
|
import function.base.LnTaylor
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import function.logarithmic.Log
|
||||||
|
import function.trigonometric.Cos
|
||||||
|
import function.trigonometric.Cot
|
||||||
|
import function.trigonometric.Csc
|
||||||
|
import function.trigonometric.Sec
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
|
class FunctionSystemTest {
|
||||||
|
private val funcSys =
|
||||||
|
FunctionSystem(SinTaylor(), LnTaylor(), Cos(SinTaylor()), Csc(SinTaylor()), Sec(SinTaylor()), Cot(SinTaylor()), Log(LnTaylor()))
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testTrigPart() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = -0.5
|
||||||
|
val result = funcSys.compute(x, eps)
|
||||||
|
assertTrue(result.isFinite())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLogPart() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 2.0
|
||||||
|
val result = funcSys.compute(x, eps)
|
||||||
|
assertTrue(result.isFinite())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testBoundaryXEqualsZero() {
|
||||||
|
val eps = 1e-10
|
||||||
|
assertFailsWith<ArithmeticException> {
|
||||||
|
funcSys.compute(0.0, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testBoundaryXEqualsOne() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val result = funcSys.compute(1.0, eps)
|
||||||
|
assertTrue((result).isNaN())
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testTrigInvalidPoint() {
|
||||||
|
val eps = 1e-10
|
||||||
|
assertFailsWith<ArithmeticException> {
|
||||||
|
funcSys.compute(-PI, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
47
src/test/kotlin/LnTest.kt
Normal file
47
src/test/kotlin/LnTest.kt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.LnTaylor
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.ln
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
|
class LnTest {
|
||||||
|
|
||||||
|
private val lnTaylor = LnTaylor()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLnOf1() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val result = lnTaylor.ln(1.0, eps)
|
||||||
|
assertEquals(0.0, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLnOfE() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = Math.E
|
||||||
|
val expected = ln(x)
|
||||||
|
val result = lnTaylor.ln(x, eps)
|
||||||
|
assertEquals(expected, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLnSmallPositive() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 2.0
|
||||||
|
val expected = ln(x)
|
||||||
|
val result = lnTaylor.ln(x, eps)
|
||||||
|
assertEquals(expected, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLnInvalid() {
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
lnTaylor.ln(0.0)
|
||||||
|
}
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
lnTaylor.ln(-1.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
49
src/test/kotlin/LogTest.kt
Normal file
49
src/test/kotlin/LogTest.kt
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.LnTaylor
|
||||||
|
import function.logarithmic.Log
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.log
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
|
class LogTest {
|
||||||
|
|
||||||
|
private val logImpl = Log(LnTaylor())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLog10() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 100.0
|
||||||
|
val result = logImpl.log(10.0, x, eps)
|
||||||
|
assertEquals(log(x, 10.0), result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLog5Of25() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 25.0
|
||||||
|
val result = logImpl.log(5.0, x, eps)
|
||||||
|
assertEquals(2.0, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLogInvalidBase() {
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
logImpl.log(-1.0, 1.0)
|
||||||
|
}
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
logImpl.log(1.0, 1.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testLogInvalidX() {
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
logImpl.log(10.0, 0.0)
|
||||||
|
}
|
||||||
|
assertFailsWith<IllegalArgumentException> {
|
||||||
|
logImpl.log(10.0, -1.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
38
src/test/kotlin/SecTest.kt
Normal file
38
src/test/kotlin/SecTest.kt
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import function.trigonometric.Sec
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.cos
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertFailsWith
|
||||||
|
|
||||||
|
class SecTest {
|
||||||
|
private val secImpl = Sec(SinTaylor())
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSecOne() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 0.5
|
||||||
|
val expected = 1.0 / cos(x)
|
||||||
|
val result = secImpl.sec(x, eps)
|
||||||
|
assertEquals(expected, result, eps * 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSecZero() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 0.0
|
||||||
|
val result = secImpl.sec(x, eps)
|
||||||
|
assertEquals(1.0 / cos(x), result, eps * 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSecInvalid() {
|
||||||
|
val eps = 1e-10
|
||||||
|
assertFailsWith<ArithmeticException> {
|
||||||
|
secImpl.sec(PI / 2, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
45
src/test/kotlin/SinTest.kt
Normal file
45
src/test/kotlin/SinTest.kt
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.math.PI
|
||||||
|
import kotlin.math.sin
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class SinTest {
|
||||||
|
private val sinTaylor = SinTaylor()
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSinZero() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val result = sinTaylor.sin(0.0, eps)
|
||||||
|
assertEquals(0.0, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSinPiOver2() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = PI / 2
|
||||||
|
val expected = sin(x)
|
||||||
|
val result = sinTaylor.sin(x, eps)
|
||||||
|
assertEquals(expected, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSinSmallX() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = 0.1
|
||||||
|
val expected = sin(x)
|
||||||
|
val result = sinTaylor.sin(x, eps)
|
||||||
|
assertEquals(expected, result, eps)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testSinNegative() {
|
||||||
|
val eps = 1e-10
|
||||||
|
val x = -0.1
|
||||||
|
val expected = sin(x)
|
||||||
|
val result = sinTaylor.sin(x, eps)
|
||||||
|
assertEquals(expected, result, eps)
|
||||||
|
}
|
||||||
|
}
|
||||||
144
src/test/kotlin/integration/BottomUpIntegrationTest.kt
Normal file
144
src/test/kotlin/integration/BottomUpIntegrationTest.kt
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
package integration
|
||||||
|
|
||||||
|
import function.FunctionSystem
|
||||||
|
import function.base.LnTaylor
|
||||||
|
import function.base.SinTaylor
|
||||||
|
import function.logarithmic.Log
|
||||||
|
import function.stubs.CosStub
|
||||||
|
import function.stubs.CotStub
|
||||||
|
import function.stubs.CscStub
|
||||||
|
import function.stubs.LnStub
|
||||||
|
import function.stubs.LogStub
|
||||||
|
import function.stubs.SecStub
|
||||||
|
import function.stubs.SinStub
|
||||||
|
import function.trigonometric.Cos
|
||||||
|
import function.trigonometric.Cot
|
||||||
|
import function.trigonometric.Csc
|
||||||
|
import function.trigonometric.Sec
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
|
val eps = 1e-10
|
||||||
|
|
||||||
|
class BottomUpIntegrationTest {
|
||||||
|
@Test
|
||||||
|
fun step1ReplaceLnStub() {
|
||||||
|
val sin = SinStub()
|
||||||
|
val ln = LnTaylor()
|
||||||
|
val cos = CosStub()
|
||||||
|
val csc = CscStub()
|
||||||
|
val sec = SecStub()
|
||||||
|
val cot = CotStub()
|
||||||
|
val log = LogStub()
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
funcSys.compute(0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step2ReplaceSinStub() {
|
||||||
|
val sin = SinTaylor()
|
||||||
|
val ln = LnStub()
|
||||||
|
val cos = CosStub()
|
||||||
|
val csc = CscStub()
|
||||||
|
val sec = SecStub()
|
||||||
|
val cot = CotStub()
|
||||||
|
val log = LogStub()
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step3CosWithSin() {
|
||||||
|
val sin = SinTaylor()
|
||||||
|
val ln = LnStub()
|
||||||
|
val cos = Cos(sin)
|
||||||
|
val csc = CscStub()
|
||||||
|
val sec = SecStub()
|
||||||
|
val cot = CotStub()
|
||||||
|
val log = LogStub()
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step4CscWithSin() {
|
||||||
|
val sin = SinTaylor()
|
||||||
|
val ln = LnStub()
|
||||||
|
val cos = CosStub()
|
||||||
|
val csc = Csc(sin)
|
||||||
|
val sec = SecStub()
|
||||||
|
val cot = CotStub()
|
||||||
|
val log = LogStub()
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step5SecWithCosSin() {
|
||||||
|
val sin = SinTaylor()
|
||||||
|
val ln = LnStub()
|
||||||
|
val cos = Cos(sin)
|
||||||
|
val csc = CscStub()
|
||||||
|
val sec = Sec(sin)
|
||||||
|
val cot = CotStub()
|
||||||
|
val log = LogStub()
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step6CotWithSinCos() {
|
||||||
|
val sin = SinTaylor()
|
||||||
|
val ln = LnStub()
|
||||||
|
val cos = Cos(sin)
|
||||||
|
val csc = CscStub()
|
||||||
|
val sec = SecStub()
|
||||||
|
val cot = Cot(sin)
|
||||||
|
val log = LogStub()
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step7LogWithLn() {
|
||||||
|
val sin = SinStub()
|
||||||
|
val ln = LnTaylor()
|
||||||
|
val cos = CosStub()
|
||||||
|
val csc = CscStub()
|
||||||
|
val sec = SecStub()
|
||||||
|
val cot = CotStub()
|
||||||
|
val log = Log(ln)
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun step8FullIntegration() {
|
||||||
|
val sin = SinTaylor()
|
||||||
|
val ln = LnTaylor()
|
||||||
|
val cos = Cos(sin)
|
||||||
|
val csc = Csc(sin)
|
||||||
|
val sec = Sec(sin)
|
||||||
|
val cot = Cot(sin)
|
||||||
|
val log = Log(ln)
|
||||||
|
|
||||||
|
val funcSys = FunctionSystem(sin, ln, cos, csc, sec, cot, log)
|
||||||
|
|
||||||
|
funcSys.compute(-0.5)
|
||||||
|
funcSys.compute(0.5)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user