diff --git a/kmath-complex/src/commonMain/kotlin/space/kscience/kmath/complex/Complex.kt b/kmath-complex/src/commonMain/kotlin/space/kscience/kmath/complex/Complex.kt index b2b17ea23..87e750387 100644 --- a/kmath-complex/src/commonMain/kotlin/space/kscience/kmath/complex/Complex.kt +++ b/kmath-complex/src/commonMain/kotlin/space/kscience/kmath/complex/Complex.kt @@ -144,12 +144,19 @@ public object ComplexField : zero } } - } else { exp(pow * ln(arg)) } - public fun power(arg: Complex, pow: Complex): Complex = exp(pow * ln(arg)) + public fun power(arg: Complex, pow: Complex): Complex = if(arg == zero || arg == (-0.0).toComplex()){ + if(pow == zero){ + one + } else { + zero + } + } else { + exp(pow * ln(arg)) + } public fun Complex.pow(power: Complex): Complex = power(this, power) diff --git a/kmath-complex/src/commonTest/kotlin/space/kscience/kmath/complex/ComplexFieldTest.kt b/kmath-complex/src/commonTest/kotlin/space/kscience/kmath/complex/ComplexFieldTest.kt index cc1f3ad0a..06f7f4580 100644 --- a/kmath-complex/src/commonTest/kotlin/space/kscience/kmath/complex/ComplexFieldTest.kt +++ b/kmath-complex/src/commonTest/kotlin/space/kscience/kmath/complex/ComplexFieldTest.kt @@ -71,6 +71,11 @@ internal class ComplexFieldTest { (i * 8).let { it.im.toInt() to it.re.toInt() }, (Complex(2, 2) pow 2).let { it.im.toInt() to it.re.toInt() }) + assertEquals(1.0, Complex(0.0).pow(Complex(0.0)).re, 0.01) + assertEquals(1.0, Complex(-0.0).pow(Complex(0.0)).re, 0.01) + assertEquals(0.0, Complex(0.0).pow(Complex(2.0)).re, 0.01) + assertEquals(0.0, Complex(-0.0).pow(Complex(2.0)).re, 0.01) + assertEquals(1.0, Complex(-1.0).pow(Complex(2.0)).re, 0.01) assertEquals(2.0, power(Complex(-4.0, 0.0), 0.5 + 0 * i).im, 0.01) assertEquals(2.0, power(Complex(-4.0, 0.0), 0.5).im, 0.01) }