Skip to content

Commit d3cb915

Browse files
Updates to tgmath functions for CGFloat (#15360)
* Updates to tgmath functions for CGFloat These changes bring CGFloat in line with the other FloatingPoint types. Some of this stuff is now defined at the protocol level, so we can get rid of it at the concrete type level. A couple other functions have been deprecated for all types, with protocol or tgmath replacements.
1 parent feae8bd commit d3cb915

File tree

3 files changed

+30
-206
lines changed

3 files changed

+30
-206
lines changed

stdlib/public/Platform/tgmath.swift.gyb

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -83,30 +83,6 @@ public func frexp<T: BinaryFloatingPoint>(_ x: T) -> (T, Int) {
8383
}
8484

8585
%for T in ['Float','Double']:
86-
@available(swift, obsoleted: 4.2)
87-
@_transparent
88-
public func scalbn(_ x: ${T}, _ n : Int) -> ${T} {
89-
return ${T}(sign: .plus, exponent: n, significand: x)
90-
}
91-
92-
@available(swift, obsoleted: 4.2)
93-
@_transparent
94-
public func modf(_ x: ${T}) -> (${T}, ${T}) {
95-
// inf/NaN: return canonicalized x, fractional part zero.
96-
guard x.isFinite else { return (x+0, 0) }
97-
let integral = trunc(x)
98-
let fractional = x - integral
99-
return (integral, fractional)
100-
}
101-
102-
@available(swift, obsoleted: 4.2)
103-
@_transparent
104-
public func frexp(_ x: ${T}) -> (${T}, Int) {
105-
guard x.isFinite else { return (x+0, 0) }
106-
guard x != 0 else { return (x, 0) }
107-
return (x.significand / 2, Int(x.exponent + 1))
108-
}
109-
11086
@available(swift, deprecated: 4.2, renamed: "scalbn")
11187
@_transparent
11288
public func ldexp(_ x: ${T}, _ n : Int) -> ${T} {

stdlib/public/SDK/CoreGraphics/CGFloat.swift.gyb

Lines changed: 27 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -499,175 +499,36 @@ public func %=(lhs: inout CGFloat, rhs: CGFloat) {
499499
// tgmath
500500
//===----------------------------------------------------------------------===//
501501

502-
@_transparent
503-
public func acos(_ x: CGFloat) -> CGFloat {
504-
return CGFloat(acos(x.native))
505-
}
506-
507-
@_transparent
508-
public func cos(_ x: CGFloat) -> CGFloat {
509-
return CGFloat(cos(x.native))
510-
}
511-
512-
@_transparent
513-
public func sin(_ x: CGFloat) -> CGFloat {
514-
return CGFloat(sin(x.native))
515-
}
516-
517-
@_transparent
518-
public func asin(_ x: CGFloat) -> CGFloat {
519-
return CGFloat(asin(x.native))
520-
}
521-
522-
@_transparent
523-
public func atan(_ x: CGFloat) -> CGFloat {
524-
return CGFloat(atan(x.native))
525-
}
526-
527-
@_transparent
528-
public func tan(_ x: CGFloat) -> CGFloat {
529-
return CGFloat(tan(x.native))
530-
}
531-
532-
@_transparent
533-
public func acosh(_ x: CGFloat) -> CGFloat {
534-
return CGFloat(acosh(x.native))
535-
}
536-
537-
@_transparent
538-
public func asinh(_ x: CGFloat) -> CGFloat {
539-
return CGFloat(asinh(x.native))
540-
}
541-
542-
@_transparent
543-
public func atanh(_ x: CGFloat) -> CGFloat {
544-
return CGFloat(atanh(x.native))
545-
}
546-
547-
@_transparent
548-
public func cosh(_ x: CGFloat) -> CGFloat {
549-
return CGFloat(cosh(x.native))
550-
}
551-
552-
@_transparent
553-
public func sinh(_ x: CGFloat) -> CGFloat {
554-
return CGFloat(sinh(x.native))
555-
}
556-
557-
@_transparent
558-
public func tanh(_ x: CGFloat) -> CGFloat {
559-
return CGFloat(tanh(x.native))
560-
}
561-
562-
@_transparent
563-
public func exp(_ x: CGFloat) -> CGFloat {
564-
return CGFloat(exp(x.native))
565-
}
566-
567-
@_transparent
568-
public func exp2(_ x: CGFloat) -> CGFloat {
569-
return CGFloat(exp2(x.native))
570-
}
571-
572-
@_transparent
573-
public func expm1(_ x: CGFloat) -> CGFloat {
574-
return CGFloat(expm1(x.native))
575-
}
576-
577-
@_transparent
578-
public func log(_ x: CGFloat) -> CGFloat {
579-
return CGFloat(log(x.native))
580-
}
581-
582-
@_transparent
583-
public func log10(_ x: CGFloat) -> CGFloat {
584-
return CGFloat(log10(x.native))
585-
}
586-
587-
@_transparent
588-
public func log2(_ x: CGFloat) -> CGFloat {
589-
return CGFloat(log2(x.native))
590-
}
591-
592-
@_transparent
593-
public func log1p(_ x: CGFloat) -> CGFloat {
594-
return CGFloat(log1p(x.native))
595-
}
596-
597-
@_transparent
598-
public func logb(_ x: CGFloat) -> CGFloat {
599-
return CGFloat(logb(x.native))
600-
}
601-
602-
@_transparent
603-
public func cbrt(_ x: CGFloat) -> CGFloat {
604-
return CGFloat(cbrt(x.native))
605-
}
606-
607-
@_transparent
608-
public func erf(_ x: CGFloat) -> CGFloat {
609-
return CGFloat(erf(x.native))
610-
}
611-
612-
@_transparent
613-
public func erfc(_ x: CGFloat) -> CGFloat {
614-
return CGFloat(erfc(x.native))
615-
}
616-
617-
@_transparent
618-
public func tgamma(_ x: CGFloat) -> CGFloat {
619-
return CGFloat(tgamma(x.native))
620-
}
621-
622-
@_transparent
623-
public func nearbyint(_ x: CGFloat) -> CGFloat {
624-
return CGFloat(nearbyint(x.native))
625-
}
626-
627-
@_transparent
628-
public func rint(_ x: CGFloat) -> CGFloat {
629-
return CGFloat(rint(x.native))
630-
}
631-
632-
@_transparent
633-
public func atan2(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
634-
return CGFloat(atan2(lhs.native, rhs.native))
635-
}
636-
637-
@_transparent
638-
public func hypot(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
639-
return CGFloat(hypot(lhs.native, rhs.native))
640-
}
641-
642-
@_transparent
643-
public func pow(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
644-
return CGFloat(pow(lhs.native, rhs.native))
645-
}
646-
647-
@_transparent
648-
public func copysign(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
649-
return CGFloat(copysign(lhs.native, rhs.native))
650-
}
502+
%{
503+
UnaryFunctions = [
504+
'acos', 'asin', 'atan', 'cos', 'sin', 'tan',
505+
'acosh', 'asinh', 'atanh', 'cosh', 'sinh', 'tanh',
506+
'exp', 'exp2', 'expm1',
507+
'log', 'log10', 'log1p', 'log2', 'logb',
508+
'cbrt', 'erf', 'erfc', 'tgamma',
509+
'nearbyint', 'rint'
510+
]
511+
512+
BinaryFunctions = [
513+
'atan2', 'hypot', 'pow', 'copysign', 'nextafter', 'fdim', 'fmax', 'fmin'
514+
]
515+
}%
651516

517+
%for ufunc in UnaryFunctions:
652518
@_transparent
653-
public func nextafter(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
654-
return CGFloat(nextafter(lhs.native, rhs.native))
519+
public func ${ufunc}(_ x: CGFloat) -> CGFloat {
520+
return CGFloat(${ufunc}(x.native))
655521
}
656522

657-
@_transparent
658-
public func fdim(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
659-
return CGFloat(fdim(lhs.native, rhs.native))
660-
}
523+
%end
661524

525+
%for bfunc in BinaryFunctions:
662526
@_transparent
663-
public func fmax(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
664-
return CGFloat(fmax(lhs.native, rhs.native))
527+
public func ${bfunc}(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
528+
return CGFloat(${bfunc}(lhs.native, rhs.native))
665529
}
666530

667-
@_transparent
668-
public func fmin(_ lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
669-
return CGFloat(fmin(lhs.native, rhs.native))
670-
}
531+
%end
671532

672533
@_transparent
673534
@available(*, unavailable, message: "use the floatingPointClass property.")
@@ -690,31 +551,16 @@ public func isnan(_ value: CGFloat) -> Bool { return value.isNaN }
690551
@available(*, unavailable, message: "use the sign property.")
691552
public func signbit(_ value: CGFloat) -> Int { return value.sign.rawValue }
692553

693-
@_transparent
694-
public func modf(_ x: CGFloat) -> (CGFloat, CGFloat) {
695-
let (ipart, fpart) = modf(x.native)
696-
return (CGFloat(ipart), CGFloat(fpart))
697-
}
698-
554+
@available(swift, deprecated: 4.2, renamed: "scalbn")
699555
@_transparent
700556
public func ldexp(_ x: CGFloat, _ n: Int) -> CGFloat {
701557
return CGFloat(ldexp(x.native, n))
702558
}
703559

704-
@_transparent
705-
public func frexp(_ x: CGFloat) -> (CGFloat, Int) {
706-
let (frac, exp) = frexp(x.native)
707-
return (CGFloat(frac), exp)
708-
}
709-
560+
@available(swift, deprecated: 4.2, message: "use the exponent property.")
710561
@_transparent
711562
public func ilogb(_ x: CGFloat) -> Int {
712-
return ilogb(x.native)
713-
}
714-
715-
@_transparent
716-
public func scalbn(_ x: CGFloat, _ n: Int) -> CGFloat {
717-
return CGFloat(scalbn(x.native, n))
563+
return Int(x.exponent)
718564
}
719565

720566
@_transparent
@@ -729,6 +575,8 @@ public func remquo(_ x: CGFloat, _ y: CGFloat) -> (CGFloat, Int) {
729575
return (CGFloat(rem), quo)
730576
}
731577

578+
@available(*, deprecated: 4.2, message:
579+
"use CGFloat(nan: CGFloat.RawSignificand) instead.")
732580
@_transparent
733581
public func nan(_ tag: String) -> CGFloat {
734582
return CGFloat(nan(tag) as CGFloat.NativeType)

test/stdlib/tgmath.swift.gyb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ internal extension TGMath {
149149
expectEqual((0.625, 2), Self._frexp(2.5))
150150
expectEqual(1, Self._ilogb(2.5))
151151
#if os(Linux) && arch(x86_64)
152-
// double-precisiion remquo is broken in the glibc in 14.04. Disable this
152+
// double-precision remquo is broken in the glibc in 14.04. Disable this
153153
// test for all Linux in the short-term to un-FAIL the build. SR-7234.
154154
if Self.significandBitCount != 52 {
155155
expectEqual(-0.25, Self._remquo(16, 0.625).0)
@@ -189,8 +189,8 @@ extension ${T}: TGMath {
189189

190190
MathTests.test("${T}") {
191191
${T}.allTests()
192-
% if T == 'Double':
193-
// Functions that are defined only for Double
192+
% if T in ['Double','CGFloat']:
193+
// Functions that are defined only for Double and CGFloat
194194
expectEqualWithTolerance(0.99750156206604, j0(0.1), ulps: 16)
195195
expectEqualWithTolerance(0.049937526036242, j1(0.1), ulps: 16)
196196
expectEqualWithTolerance(1.2229926610356451e-22, jn(11, 0.1), ulps: 16)

0 commit comments

Comments
 (0)