Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 30 additions & 9 deletions Sources/Complex/Functions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -158,17 +158,32 @@ public func sin(_ value: Complex<Float80>) -> Complex<Float80> {

@_transparent
public func asin(_ value: Complex<Float>) -> Complex<Float> {
return -.i * log(.i * value + sqrt(1.0 - value * value))
//swiftlint:disable identifier_name
let iz = .i * value
let root = sqrt(1.0 - (value * value))

return -.i * log(iz + root)
//swiftlint:enable identifier_name
}

@_transparent
public func asin(_ value: Complex<Double>) -> Complex<Double> {
return -.i * log(.i * value + sqrt(1.0 - value * value))
//swiftlint:disable identifier_name
let iz = .i * value
let root = sqrt(1.0 - (value * value))

return -.i * log(iz + root)
//swiftlint:enable identifier_name
}

@_transparent
public func asin(_ value: Complex<Float80>) -> Complex<Float80> {
return -.i * log(.i * value + sqrt(1.0 - value * value))
//swiftlint:disable identifier_name
let iz = .i * value
let root = sqrt(1.0 - (value * value))

return -.i * log(iz + root)
//swiftlint:enable identifier_name
}

//
Expand Down Expand Up @@ -212,17 +227,20 @@ public func cos(_ value: Complex<Float80>) -> Complex<Float80> {

@_transparent
public func acos(_ value: Complex<Float>) -> Complex<Float> {
return -.i * log(value + sqrt(value * value - 1.0))
let root = sqrt((value * value) - 1.0)
return -.i * log(value + root)
}

@_transparent
public func acos(_ value: Complex<Double>) -> Complex<Double> {
return -.i * log(value + sqrt(value * value - 1.0))
let root = sqrt((value * value) - 1.0)
return -.i * log(value + root)
}

@_transparent
public func acos(_ value: Complex<Float80>) -> Complex<Float80> {
return -.i * log(value + sqrt(value * value - 1.0))
let root = sqrt((value * value) - 1.0)
return -.i * log(value + root)
}

//
Expand Down Expand Up @@ -265,17 +283,20 @@ public func tan(_ value: Complex<Float80>) -> Complex<Float80> {

@_transparent
public func atan(_ value: Complex<Float>) -> Complex<Float> {
return .i * 0.5 * log((.i + value) / (.i - value))
let quotient = (.i + value) / (.i - value)
return .i * 0.5 * log(quotient)
}

@_transparent
public func atan(_ value: Complex<Double>) -> Complex<Double> {
return .i * 0.5 * log((.i + value) / (.i - value))
let quotient = (.i + value) / (.i - value)
return .i * 0.5 * log(quotient)
}

@_transparent
public func atan(_ value: Complex<Float80>) -> Complex<Float80> {
return .i * 0.5 * log((.i + value) / (.i - value))
let quotient = (.i + value) / (.i - value)
return .i * 0.5 * log(quotient)
}

//
Expand Down
13 changes: 10 additions & 3 deletions Sources/Complex/Functions.swift.gyb
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,12 @@ public func sin(_ value: Complex<${type}>) -> Complex<${type}> {
% for type in ["Float", "Double", "Float80"]:
@_transparent
public func asin(_ value: Complex<${type}>) -> Complex<${type}> {
return -.i * log(.i * value + sqrt(1.0 - value * value))
//swiftlint:disable identifier_name
let iz = .i * value
let root = sqrt(1.0 - (value * value))

return -.i * log(iz + root)
//swiftlint:enable identifier_name
}

% end
Expand Down Expand Up @@ -147,7 +152,8 @@ public func cos(_ value: Complex<${type}>) -> Complex<${type}> {
% for type in ["Float", "Double", "Float80"]:
@_transparent
public func acos(_ value: Complex<${type}>) -> Complex<${type}> {
return -.i * log(value + sqrt(value * value - 1.0))
let root = sqrt((value * value) - 1.0)
return -.i * log(value + root)
}

% end
Expand Down Expand Up @@ -176,7 +182,8 @@ public func tan(_ value: Complex<${type}>) -> Complex<${type}> {
% for type in ["Float", "Double", "Float80"]:
@_transparent
public func atan(_ value: Complex<${type}>) -> Complex<${type}> {
return .i * 0.5 * log((.i + value) / (.i - value))
let quotient = (.i + value) / (.i - value)
return .i * 0.5 * log(quotient)
}

% end
Expand Down
54 changes: 45 additions & 9 deletions Tests/ComplexTests/FunctionsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,31 @@ class FunctionsTests: XCTestCase {

func test_asin() {
for complex in sampleComplexNumbers(ofType: Float.self) {
XCTAssertEqual(asin(complex), -.i * log(.i * complex + sqrt(1.0 - complex * complex)), accuracy: 0.0001)
//swiftlint:disable identifier_name
let iz = .i * complex
let root = sqrt(1.0 - (complex * complex))
let result = -.i * log(iz + root)
//swiftlint:enable identifier_name

XCTAssertEqual(asin(complex), result, accuracy: 0.0001)
}
for complex in sampleComplexNumbers(ofType: Double.self) {
XCTAssertEqual(asin(complex), -.i * log(.i * complex + sqrt(1.0 - complex * complex)), accuracy: 0.0001)
//swiftlint:disable identifier_name
let iz = .i * complex
let root = sqrt(1.0 - (complex * complex))
let result = -.i * log(iz + root)
//swiftlint:enable identifier_name

XCTAssertEqual(asin(complex), result, accuracy: 0.0001)
}
for complex in sampleComplexNumbers(ofType: Float80.self) {
XCTAssertEqual(asin(complex), -.i * log(.i * complex + sqrt(1.0 - complex * complex)), accuracy: 0.0001)
//swiftlint:disable identifier_name
let iz = .i * complex
let root = sqrt(1.0 - (complex * complex))
let result = -.i * log(iz + root)
//swiftlint:enable identifier_name

XCTAssertEqual(asin(complex), result, accuracy: 0.0001)
}
}

Expand Down Expand Up @@ -192,13 +210,22 @@ class FunctionsTests: XCTestCase {

func test_acos() {
for complex in sampleComplexNumbers(ofType: Float.self) {
XCTAssertEqual(acos(complex), -.i * log(complex + sqrt(complex * complex - 1.0)), accuracy: 0.0001)
let root = sqrt((complex * complex) - 1.0)
let result = -.i * log(complex + root)

XCTAssertEqual(acos(complex), result, accuracy: 0.0001)
}
for complex in sampleComplexNumbers(ofType: Double.self) {
XCTAssertEqual(acos(complex), -.i * log(complex + sqrt(complex * complex - 1.0)), accuracy: 0.0001)
let root = sqrt((complex * complex) - 1.0)
let result = -.i * log(complex + root)

XCTAssertEqual(acos(complex), result, accuracy: 0.0001)
}
for complex in sampleComplexNumbers(ofType: Float80.self) {
XCTAssertEqual(acos(complex), -.i * log(complex + sqrt(complex * complex - 1.0)), accuracy: 0.0001)
let root = sqrt((complex * complex) - 1.0)
let result = -.i * log(complex + root)

XCTAssertEqual(acos(complex), result, accuracy: 0.0001)
}
}

Expand Down Expand Up @@ -228,13 +255,22 @@ class FunctionsTests: XCTestCase {

func test_atan() {
for complex in sampleComplexNumbers(ofType: Float.self) {
XCTAssertEqual(atan(complex), .i * 0.5 * log((.i + complex) / (.i - complex)), accuracy: 0.0001)
let quotient = (.i + complex) / (.i - complex)
let result = .i * 0.5 * log(quotient)

XCTAssertEqual(atan(complex), result, accuracy: 0.0001)
}
for complex in sampleComplexNumbers(ofType: Double.self) {
XCTAssertEqual(atan(complex), .i * 0.5 * log((.i + complex) / (.i - complex)), accuracy: 0.0001)
let quotient = (.i + complex) / (.i - complex)
let result = .i * 0.5 * log(quotient)

XCTAssertEqual(atan(complex), result, accuracy: 0.0001)
}
for complex in sampleComplexNumbers(ofType: Float80.self) {
XCTAssertEqual(atan(complex), .i * 0.5 * log((.i + complex) / (.i - complex)), accuracy: 0.0001)
let quotient = (.i + complex) / (.i - complex)
let result = .i * 0.5 * log(quotient)

XCTAssertEqual(atan(complex), result, accuracy: 0.0001)
}
}

Expand Down
18 changes: 15 additions & 3 deletions Tests/ComplexTests/FunctionsTests.swift.gyb
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,13 @@ class FunctionsTests: XCTestCase {
func test_asin() {
% for type in ["Float", "Double", "Float80"]:
for complex in sampleComplexNumbers(ofType: ${type}.self) {
XCTAssertEqual(asin(complex), -.i * log(.i * complex + sqrt(1.0 - complex * complex)), accuracy: 0.0001)
//swiftlint:disable identifier_name
let iz = .i * complex
let root = sqrt(1.0 - (complex * complex))
let result = -.i * log(iz + root)
//swiftlint:enable identifier_name

XCTAssertEqual(asin(complex), result, accuracy: 0.0001)
}
% end
}
Expand All @@ -159,7 +165,10 @@ class FunctionsTests: XCTestCase {
func test_acos() {
% for type in ["Float", "Double", "Float80"]:
for complex in sampleComplexNumbers(ofType: ${type}.self) {
XCTAssertEqual(acos(complex), -.i * log(complex + sqrt(complex * complex - 1.0)), accuracy: 0.0001)
let root = sqrt((complex * complex) - 1.0)
let result = -.i * log(complex + root)

XCTAssertEqual(acos(complex), result, accuracy: 0.0001)
}
% end
}
Expand All @@ -183,7 +192,10 @@ class FunctionsTests: XCTestCase {
func test_atan() {
% for type in ["Float", "Double", "Float80"]:
for complex in sampleComplexNumbers(ofType: ${type}.self) {
XCTAssertEqual(atan(complex), .i * 0.5 * log((.i + complex) / (.i - complex)), accuracy: 0.0001)
let quotient = (.i + complex) / (.i - complex)
let result = .i * 0.5 * log(quotient)

XCTAssertEqual(atan(complex), result, accuracy: 0.0001)
}
% end
}
Expand Down