@@ -1890,82 +1890,81 @@ extension BinaryFloatingPoint {
1890
1890
/// - Parameter value: A floating-point value to be converted.
1891
1891
@inlinable
1892
1892
public init < Source: BinaryFloatingPoint > ( _ value: Source ) {
1893
+ // If two IEEE 754 binary interchange formats share the same exponent bit
1894
+ // count and significand bit count, then they must share the same encoding
1895
+ // for finite and infinite values.
1896
+ switch ( Source . exponentBitCount, Source . significandBitCount) {
1893
1897
#if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
1894
- if #available( iOS 14 . 0 , watchOS 7 . 0 , tvOS 14 . 0 , * ) {
1895
- if case let value_ as Float16 = value {
1896
- self = Self ( Float ( value_) )
1897
- return
1898
- }
1899
- }
1900
- #endif
1901
- switch value {
1902
- case let value_ as Float :
1903
- self = Self ( value_)
1904
- case let value_ as Double :
1905
- self = Self ( value_)
1906
- #if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64))
1907
- case let value_ as Float80 :
1908
- self = Self ( value_)
1909
- #endif
1910
- default :
1911
- if value. isFinite {
1912
- // According to IEEE 754:
1913
- // - The set of finite floating-point numbers representable within a
1914
- // particular format is determined by: the radix (b), the precision
1915
- // (p, the number of digits in the significand), and the maximum and
1916
- // minimum exponent (emax and emin, respectively, where
1917
- // emin = 1 - emax).
1918
- // - In a binary interchange format, each floating-point number has only
1919
- // one encoding.
1920
- //
1921
- // If two binary interchange formats have the same exponent bit count
1922
- // (w) and significand bit count (p - 1), then they must share the same
1923
- // encoding for finite values.
1924
- switch ( Source . exponentBitCount, Source . significandBitCount) {
1925
- #if !os(macOS) && !(os(iOS) && targetEnvironment(macCatalyst))
1926
- case ( 5 , 10 ) :
1927
- if #available( iOS 14 . 0 , watchOS 7 . 0 , tvOS 14 . 0 , * ) {
1928
- let value_ = Float16 (
1929
- sign: value. sign,
1930
- exponentBitPattern: Float16 . RawExponent ( value. exponentBitPattern) ,
1931
- significandBitPattern:
1932
- Float16 . RawSignificand ( value. significandBitPattern) )
1933
- self = Self ( Float ( value_) )
1934
- return
1935
- }
1936
- #endif
1937
- case ( 8 , 23 ) :
1938
- let value_ = Float (
1939
- sign: value. sign,
1940
- exponentBitPattern: Float . RawExponent ( value. exponentBitPattern) ,
1941
- significandBitPattern:
1942
- Float . RawSignificand ( value. significandBitPattern) )
1943
- self = Self ( value_)
1898
+ case ( 5 , 10 ) :
1899
+ if #available( iOS 14 . 0 , watchOS 7 . 0 , tvOS 14 . 0 , * ) {
1900
+ if case let value_ as Float16 = value {
1901
+ self = Self ( Float ( value_) )
1944
1902
return
1945
- case ( 11 , 52 ) :
1946
- let value_ = Double (
1947
- sign: value. sign,
1948
- exponentBitPattern: Double . RawExponent ( value. exponentBitPattern) ,
1949
- significandBitPattern:
1950
- Double . RawSignificand ( value. significandBitPattern) )
1951
- self = Self ( value_)
1952
- return
1953
- #if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64))
1954
- case ( 15 , 63 ) :
1955
- let value_ = Float80 (
1903
+ }
1904
+ if !value. isNaN {
1905
+ let value_ = Float16 (
1956
1906
sign: value. sign,
1957
- exponentBitPattern: Float80 . RawExponent ( value. exponentBitPattern) ,
1958
- significandBitPattern:
1959
- Float80 . RawSignificand ( value. significandBitPattern) )
1960
- self = Self ( value_)
1907
+ exponentBitPattern: UInt ( value. exponentBitPattern) ,
1908
+ significandBitPattern: UInt16 ( value. significandBitPattern) )
1909
+ self = Self ( Float ( value_) )
1961
1910
return
1962
- #endif
1963
- default :
1964
- break
1965
1911
}
1966
1912
}
1967
- self = Self . _convert ( from: value) . value
1913
+ #endif
1914
+ case ( 8 , 7 ) :
1915
+ if !value. isNaN {
1916
+ let value_ = Float (
1917
+ sign: value. sign,
1918
+ exponentBitPattern: UInt ( value. exponentBitPattern) ,
1919
+ significandBitPattern: UInt32 ( value. significandBitPattern) &<< 16 )
1920
+ self = Self ( value_)
1921
+ return
1922
+ }
1923
+ case ( 8 , 23 ) :
1924
+ if case let value_ as Float = value {
1925
+ self = Self ( value_)
1926
+ return
1927
+ }
1928
+ if !value. isNaN {
1929
+ let value_ = Float (
1930
+ sign: value. sign,
1931
+ exponentBitPattern: UInt ( value. exponentBitPattern) ,
1932
+ significandBitPattern: UInt32 ( value. significandBitPattern) )
1933
+ self = Self ( value_)
1934
+ return
1935
+ }
1936
+ case ( 11 , 52 ) :
1937
+ if case let value_ as Double = value {
1938
+ self = Self ( value_)
1939
+ return
1940
+ }
1941
+ if !value. isNaN {
1942
+ let value_ = Double (
1943
+ sign: value. sign,
1944
+ exponentBitPattern: UInt ( value. exponentBitPattern) ,
1945
+ significandBitPattern: UInt64 ( value. significandBitPattern) )
1946
+ self = Self ( value_)
1947
+ return
1948
+ }
1949
+ #if !(os(Windows) || os(Android)) && (arch(i386) || arch(x86_64))
1950
+ case ( 15 , 63 ) :
1951
+ if case let value_ as Float80 = value {
1952
+ self = Self ( value_)
1953
+ return
1954
+ }
1955
+ if !value. isNaN {
1956
+ let value_ = Float80 (
1957
+ sign: value. sign,
1958
+ exponentBitPattern: UInt ( value. exponentBitPattern) ,
1959
+ significandBitPattern: UInt64 ( value. significandBitPattern) )
1960
+ self = Self ( value_)
1961
+ return
1962
+ }
1963
+ #endif
1964
+ default :
1965
+ break
1968
1966
}
1967
+ self = Self . _convert ( from: value) . value
1969
1968
}
1970
1969
1971
1970
/// Creates a new instance from the given value, if it can be represented
0 commit comments