-- Views
September 04, 16
スライド概要
Swift 3.0 で、廃止される BooleanType と、強化される FloatingPoint と。それらを見たときに感じた衝撃。その事実を観察しながら、実際の様子、感じたこと、これからのこと。そんなことを綴った発表資料です。
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 3,558 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
1SPUPDPM0SJFOUFE1SPHSBNNJOH ເͱ࣮ݱͷؒڱ ୈճΧδϡΞϧ4XJGUษڧձPO &;/&5۽୩༑ IUUQF[OFUKQ 4XJGU%FWFMPQFS1SFWJFX
4XJGUͷมߋΛோΊ͍ͯͨ
ͦΜͳதͰग़ձͬͨিܸͷग़དྷࣄ
#PPMFBO5ZQFͷফ໓ struct Variant : BooleanType { }
'MPBUJOH1PJOUͷෳࡶԽ QSPUPDPM'MPBUJOH1PJOU$PNQBSBCMF &YQSFTTJCMF#Z*OUFHFS-JUFSBM 4JHOFE/VNCFS "CTPMVUF7BMVBCMF 4USJEFBCMF\ BTTPDJBUFEUZQF&YQPOFOU4JHOFE*OUFHFS JOJU TJHO'MPBUJOH1PJOU4JHO FYQPOFOU4FMG&YQPOFOU TJHOJGJDBOE4FMG JOJU TJHO0G4FMG NBHOJUVEF0G4FMG TUBUJDWBSSBEJY*OU\HFU^ TUBUJDWBSOBO4FMG\HFU^ TUBUJDWBSTJHOBMJOH/B/4FMG\HFU^ TUBUJDWBSJOGJOJUZ4FMG\HFU^ TUBUJDWBSHSFBUFTU'JOJUF.BHOJUVEF4FMG\HFU^ TUBUJDWBSQJ4FMG\HFU^ WBSVMQ4FMG\HFU^ TUBUJDWBSVMQ0G0OF4FMG\HFU^ TUBUJDWBSMFBTU/PSNBM.BHOJUVEF4FMG\HFU^ TUBUJDWBSMFBTU/PO[FSP.BHOJUVEF4FMG\HFU^ WBSTJHO'MPBUJOH1PJOU4JHO\HFU^ WBSFYQPOFOU4FMG&YQPOFOU\HFU^ WBSTJHOJGJDBOE4FMG\HFU^ GVODBEEJOH @PUIFS4FMG 4FMG
ഭΓدΔ*OUFHFSͷߴԽ
ϓϩτίϧͬͯ ⾣ ͬͱநతͳ֓೦Λɺද͢ݱΔͱࢥͬͯͨɻ ⾣ ՄೳੑΛγϯϓϧʹɺද͢ݱΔͱࢥͬͯͨɻ
ϓϩτίϧͷੈքɺͲ͏ͳͬͪΌ͏ͷʁ
நԽ ۩Խ ເͱ࣮ݱͷؒڱ #PPMFBO5ZQF 'MPBUJOH1PJOU *OUFHFS
۽୩༑ 5PNPIJSP,VNBHBJ ⾣ 4XJGU͕ޠݴେ͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษڧձ͕େ͖Ͱ͢ʂ ⾣ ϓϩάϥϛϯάͷָ͠͞Λ͍͖͍͑ͯͨɻ !FT@LVNBHBJ UPNPIJSPLVNBHBJ $PEF1JFDFGPSNBD04 IUUQF[OFUKQ 9DPEFపఈղઆ
ษڧձΛ։࠵͍ͯ͠·͢ɻ Θ͍Θ͍ɺָ͘͠ɺ ΈΜͳͰޠΒ͑ΔॴΛࢦͯ͠ɻ ԣJ1IPOF։ൃऀษڧձ ΈΜͳͰ4XJGU ෮शձ ZJEFW ˏԣɾഅंಓ NJOOB@EF@TXJGU ˏौ୩ ୈճ݄ͷ։࠵ʢඪʣ ୈճΛ݄ʹ։࠵ʢݕ౼ʣ IUUQTBUOEPSHHSPVQTZJEFW IUUQDTXJGUDPOOQBTTDPN
ωοτϥδΦ Ќ์ૹ։࢝ ϓϩάϥϛϯά͕େ͖ͳ̎ਓͰɺ ϓϩάϥϜޠָ͍ͯͭ͘͠ʹޠݴΒ͏൪ NPPLNPPLSBEJP Ќ൛ ۽୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ͔Β ௌ͑ͯ͘͜ΔʹࣖΛָ͚ͯ͠ΉϥδΦ ୈ݄ͷ์ૹʢࠐݟʣ IUUQNPPLNPPLSBEJPDPNB
$PEF1JFDFGPSNBD04 ษڧձΛָ͠ΉΞϓϦ ⾣ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌ߘ ⾣ ίʔυཝΛۭʹ͢Εɺී௨ʹπΠʔτՄೳ ⾣ ϋογϡλάΛઃఆͰ͖Δʗ͚Εͳ͍ #cswift
#PPMFBO5ZQFͷফ໓ 4&
#PPMFBO5ZQFͷফ໓ #PPMFBO5ZQFϓϩτίϧJO4XJGU ⾣ ਅِΛද͢ݱΔϓϩτίϧ ⾣ 4XJGUͰɺద༻ͨ͠ܕJGͷධՁʹ͑ͨ protocol BooleanType { var boolValue: Bool { get } } // 適用した型は、そのまま condition として使える let value = MyValue() if value { }
#PPMFBO5ZQFͷফ໓ #PPMFBO5ZQFϓϩτίϧJO4XJGU ⾣ 4XJGU͔Β#PPMFBO5ZQFϓϩτίϧഇࢭ ⾣ JGͳͲͷධՁʹ͑Δͷ#PPMͷΈ // protocol BooleanType { // var boolValue: Bool { get } // } // Bool 以外は condition に使えない let value = MyValue() if value { } b.Z#PPM`JTOPUDPOWFSUJCMFUPb#PPM`
#PPMFBO5ZQFͷফ໓ ഇࢭͷཧ༝ ⾣ ਅِͷநԽෳࡶ͞Λট͘ ⾣ େͷ"1*Ͱ#PPMFBO5ZQFͰͳ͘#PPMΛఆ // こんな風に API を書いてましたか? func removeAll<T: BooleanType>(keepCapacity: T) { } // こう書いていませんでしたか? func removeAll(keepCapacity: Bool) { }
#PPMFBO5ZQFͷফ໓ ඪ४ϥΠϒϥϦͰͷࣄྫ ⾣ ඪ४ϥΠϒϥϦͰɺ΄ͱΜͲΘΕͳ͔ͬͨ ⾣ ԋࢉࢠ cc͚ͩͰΘΕ͍ͯͨ prefix func !<T : BooleanType>(a: T) -> Bool func &&<T : BooleanType, U : BooleanType> (lhs: T, @autoclosure rhs: () -> U) -> Bool func ||<T : BooleanType, U : BooleanType> (lhs: T, @autoclosure rhs: () -> U) -> Bool
#PPMFBO5ZQFͷফ໓ நԽͷඞཁੑ͕ݮগ ⾣ #PPM 0CK$#PPM $#PPM͕͋ͬͨ ⾣ 0CKFDUJWF$*OUFSPQFSBCJMJUZͷൃୡͰ#PPM͕ओྲྀʹ // 普通は Bool 型しか受け取らない // ObjCBool を受け取ったら boolValue で Bool 値を取得 if objcBool.boolValue { } // ちなみに CBool は Bool の型エイリアス typealias CBool = Bool
ഇࢭܾఆ
#PPMFBO5ZQFͷফ໓ ഇࢭํ๏ ⾣ #PPMFBO5ZQFϓϩτίϧΛ#PPMͰܕࢦఆ ⾣ Өڹൣғɺԋࢉࢠ cc͚ͩ prefix func !(a: Bool) -> Bool func &&(lhs: Bool, @autoclosure rhs: () -> Bool) -> Bool func ||(lhs: Bool, @autoclosure rhs: () -> Bool) -> Bool
#PPMFBO5ZQFͷফ໓ ഇࢭͷӨڹ ⾣ JGͳͲͷධՁʹ#PPMҎ֎͑ͳ͘ͳΔ ⾣ 0CK$#PPMCPPM7BMVFϓϩύςΟͷ༻͕ඞਢʹ let condition: ObjCBool = true if condition.boolValue { }
͜ΕͰΑ͔ͬͨͷ͔ͳʁ
#PPMFBO5ZQFͷফ໓ CPPM7BMVFɺنఆ͞Εͳ͍ ⾣ #PPMΛऔಘ͢ΔCPPM7BMVFɺ͕ࣗܕओతʹ࣋ͭ ⾣ ϓϩτίϧͰͷنఆ͕ͳ͍ͱɺ൚༻Խ͠ʹ͍͘ʁ struct ObjCBool { var boolValue: Bool } // ジェネリックで使いたいときは…また作りますか? protocol Boolean { var boolValue: Bool } extension ObjCBool : Boolean { }
#PPMFBO5ZQFͷফ໓ ਅِͷҙຯɺʹܕΑͬͯҧ͏͔ ⾣ #PPMΛҙຯ͢Δද͕ݱCPPM7BMVFͱݶΒͳ͍ ⾣ ϓϩτίϧʹنఆ͞Εͳ͍ͷɺޭΛ͢Δ͔ʁ // ともすると、真か偽を表現しそうな型 enum Result { case success case failure // これが boolValue だと『何が真か』考える間が発生 var isOK: Bool { … } }
#PPMFBO5ZQFͷফ໓ 4XJGUZ+40/ɺͲ͏ରॲ͔ͨ͠ ⾣ #PPMFBO5ZQFͱ͍͑4XJGUZ+40/ ⾣ ୯७ʹ#PPMFBO5ZQFΛফͯ͠ରԠͷࠐݟΈ // BooleanType 適用を廃止 extension JSON /* : BooleanType */ { // boolValue プロパティは存続 var boolValue: Bool { … } } // 判定は boolValue 必須だが、むしろ意味を汲みやすい? if json.boolValue { }
'MPBUJOH1PJOUͷෳࡶԽ 4&
ුಈখ
'MPBUJOH1PJOUͷෳࡶԽ ුಈখ Ծ ࢦ ج ⾣ খΛද͢ݱΔΈ ⾣ খͷҐஔΛಈతཧ͢Δσʔλߏ ⾣ Ծɾجɾࢦͷ̏ͭͰද͢ݱΔ ⾣ ແݶେɾඇΛද͖ͰݱΔ
'MPBUJOH1PJOUͷෳࡶԽ جຊಈ࡞ ⾣ ෳͷුಈখ͕͋ܕΔ ⾣ ඇ/B/ɺແݶେ*OpOJUZΛఆ // Double は倍精度浮動小数点数 (64 bit) let value: Double = 10.5 // Float は単精度浮動小数点数 (32 bit) let value: Float = 10.5 // 0.0 で割ると、無限大 value / 0.0 // inf // 表現しきれない値は、無限大 pow(35.0, 256.0) // inf
'MPBUJOH1PJOUͷෳࡶԽ ඇʜRVJFU/B/ ⾣ ओʹɺ݁ࢉܭՌ͕ࣈͰͳ͍࣌ʹಘΒΕΔ ⾣ OBOʹԿΛͯ͠ࢉܭOBOΛҡ࣋͢Δ // 数字にならない計算は、非数値 0.0 / 0.0 // nan // 非数値に演算しても、非数値 Double.nan + 10.0 // nan // 非数値を無限大で割っても、非数値 Double.nan / Double.infinity // nan // 負の非数値というのもある (-Double.nan).sign // minus
'MPBUJOH1PJOUͷෳࡶԽ ඇʜTJHOBMJOH/B/ ⾣ ্༷ɺʹ࣌ࢉܭΤϥʔΛݕग़Ͱ͖Δඇ ⾣ ্༷ͷɺΤϥʔ࣌ͷنఆಈ࡞RVJFU/B/ѻ͍ // signaling NaN を計算すると quiet NaN Double.signalingNaN / 10.0 // quiet NaN // ただし signaling NaN * -1 なら維持 (Double.signalingNaN * -1).sign // minus
'MPBUJOH1PJOUͷෳࡶԽ ແݶେʜJOpOJUZ ⾣ ද͖͠Εͳ͍େ͖ͳΛදݱ ⾣ ແݶେɺಛผѻ͍ // 無限大から大きな値を引いても、無限大 Float.infinity - 1.0e+38 // inf // 最大値に十分な値を足すと、無限大 maxFloat + 1.0e+38 // inf // 最大値に小さな値を足しても、無限にはならない maxFloat + 1.0 // maxFloat // 一旦無限になると、辻褄が合わなくなることも maxFloat + 1.0e+38 - 1.0e+38 // inf
'MPBUJOH1PJOUͷෳࡶԽ ແݶେʜʶJOpOJUZ ⾣ Ͱׂͬͨͱ͖ͷදʹݱ͏ ⾣ ແݶେͷ͓͔͛Ͱ×Λද͖ͰݱΔ // 正の方向から割ると、+∞ 1.0 / 0.0 // inf y // 負の方向から割ると、-∞ 1.0 / -0.0 // -inf O x // 浮動小数点数でないと // 表現できない 1 / 0 // ERROR y = 1/x
ුಈখ ͋·Γ͔ͨͬͳͯͬͯ͠ʹؾʜ
'MPBUJOH1PJOUϓϩτίϧ JO4XJGU
'MPBUJOH1PJOUͷෳࡶԽ 'MPBUJOH1PJOUϓϩτίϧJO4XJGU ⾣ ුಈখΛදݱ w *&&&֨نΛҙ͍ࣝͯ͠Δʁ ⾣ ॳาతͳৼΔ͍Λنఆ w ͔ܕΒͷม w ࡏݱͷঢ়گఆ w ಛघͷऔಘ ⾣ 4USJEFBCMFʹ४ڌ
'MPBUJOH1PJOUͷෳࡶԽ ͔ܕΒͷมJO4XJGU ⾣ ֤छ͔ܕΒɺม͢ΔΠχγϟϥΠβΛنఆ ⾣ ͳͥɺ͔ܕΒͷม͚ͩʁ͔͠ϓϩτίϧͰʁ init(_ value: UInt8) init(_ value: Int8) init(_ value: UInt16) init(_ value: Int16) init(_ value: UInt32) init(_ value: Int32) init(_ value: UInt64) init(_ value: Int64) init(_ value: UInt) init(_ value: Int)
'MPBUJOH1PJOUͷෳࡶԽ ࡏݱͷঢ়گఆJO4XJGU ⾣ *&&&Λҙࣝͨ͠ঢ়گఆ͕Մೳ ⾣ ͬͨ͜ͱͳ͔ͬͨʜʂ ߲ WBSGMPBUJOH1PJOU$MBTT 'MPBUJOH1PJOU$MBTTJGJDBUJPO WBSJT4JHO.JOVT#PPM WBSJT/PSNBM#PPM WBSJT'JOJUF#PPM WBSJT;FSP#PPM WBSJT4VCOPSNBM#PPM WBSJT*OpOJUF#PPM WBSJT/B/#PPM WBSJT4JHOBMJOH#PPM ༻్ *&&&Ͱ͍͏ྨΛऔಘ ූ߸͕ϚΠφεͳΒਅ ਖ਼نԽͳΒਅʢ͍ͳ·ؚʣ ɾਖ਼نԽɾඇਖ਼نԽͳΒਅ ͳΒਅ ඇਖ਼ͳنΒਅʢ͍ͳ·ؚʣ ແݶେͳΒਅ ඇ T/B/ R/B/ ͳΒਅ TJHOBMJOH/B/ T/B/ ͳΒਅ
'MPBUJOH1PJOUͷෳࡶԽ ಛघͷऔಘJO4XJGU ⾣ *&&&ͷಛघΛऔಘՄೳ ⾣ ͪ͜Β໓ଟʹΘͳ͍ʜʂ ߲ TUBUJDWBSJOGJOJUZ4FMG WBS/B/4FMG WBSRVJFU/B/#PPM ༻్ 㱣 RVJFU/B/ RVJFU/B/ʢ/B/ͱಉ͡ʣ
4XJGUͷ'MPBUJOH1PJOU ⾣ TJHOBMJOH/B/ΛऔಘͰ͖ͳ͍ʁ ⾣ ࠷େΛऔಘ͢Δʹʁ
TJHOBMJOH/B/ΛऔಘͰ͖ͳ͍ʁ
'MPBUJOH1PJOUͷෳࡶԽ 4JHOBMJOH/B/ͷੜJO4XJGU ⾣ 4JHOBMJOH/B/ʹ૬͢ΔϏοτྻͰΛੜ ⾣ ුಈখʹϏοτΩϟετ͢Δ // Float 型の Signaling NaN を作る var sNaNSeed = 0b1_11111111_00000000000000000000001 as UInt32 var sNaN = unsafeBitCast(sNaNSeed, to: Float.self)
'MPBUJOH1PJOUͷෳࡶԽ ࠷େͷੜJO4XJGU ⾣ ࠷େʹ૬͢ΔϏοτྻͰΛੜ ⾣ ුಈখʹϏοτΩϟετ͢Δ // Float 型の最大値を作る var maxSeed = 0b0_11111110_11111111111111111111111 as UInt32 var max = unsafeBitCast(maxSeed, to: Float.self)
'MPBUJOH1PJOUϓϩτίϧ JO4XJGU
'MPBUJOH1PJOUͷෳࡶԽ 'MPBUJOH1PJOUϓϩτίϧJO4XJGU ⾣ 'MPBUJOH1PJOUͷେ෯ͳػೳ֦ு ⾣ ੑ࣭ͷ֦ு w େখൺֱՄೳ w ϦςϥϧʹରԠ ⾣ ػೳՃ w جຊఆͷఏڙ w ߏใͷఏڙ
'MPBUJOH1PJOUͷෳࡶԽ ४͢ڌΔϓϩτίϧ ⾣ 'MPBUJOH1PJOU͚ͩͰɺ۩ମతʹಈ͚ͦ͏ͳҹ ⾣ &YQSFTTJCMF#Z*OUFHFS-JUFSBMͬͯඞཁʜʁ ߲ $PNQBSBCMF &YQSFTTJCMF#Z*OUFHFS-JUFSBM 4JHOFE/VNCFS "CTPMVUF7BMVBCMF 4USJEFBCMF ༻్ େ খൺ ֱ Մ ೳ ϦςϥϧͰදݱՄೳ ූ߸͖ ઈରදݱՄೳ ҙͷࠁΈͰҠಈՄೳ
'MPBUJOH1PJOUͷෳࡶԽ ༰Λࢦఆͯ͠ੜ ࢦ ⾣ *&&&ුಈখͰදݱ Ծ ج ⾣ ߏཁૉΛࢦఆͯ͠ΠϯελϯεΛੜͰ͖Δ associatedtype Exponent : SignedInteger init(sign: FloatingPointSign, exponent: Exponent, significand: Self) 210 を作れる(Float の基数は 2 ) Float(sign: .plus, exponent: 10, significand: 1.5) // 浮動小数点数 1.5
'MPBUJOH1PJOUͷෳࡶԽ ූ߸Λࠩ͠ସ͑ͨੜ ⾣ ยଆͷූ߸ͱɺยଆͷઈରͱͰɺΛ࡞Δ ⾣ *&&&ͷlDPQZTJHOzૢ࡞Λ࣮͍ͯ͠ݱΔΒ͍͠ associatedtype Exponent : SignedInteger init(signOf: Self, magnitudeOf: Self) // value1 の符号と value2 の絶対値を合わせて、値を作る Float(signOf: value1, magnitudeOf: value2)
'MPBUJOH1PJOUͷෳࡶԽ ࡏݱͷঢ়گఆ ⾣ *&&&Λҙࣝͨ͠ঢ়گఆ͕Մೳ ⾣ JT4JHO.JOVTআɺJT4JHOBMJOHͷඌʹ/B/͕༩ ߲ WBSGMPBUJOH1PJOU$MBTT 'MPBUJOH1PJOU$MBTTJGJDBUJPO WBSJT/PSNBM#PPM WBSJT'JOJUF#PPM WBSJT;FSP#PPM WBSJT4VCOPSNBM#PPM WBSJT*OpOJUF#PPM WBSJT/B/#PPM WBSJT4JHOBMJOH/B/#PPM WBSJT$BOPOJDBM#PPM ༻్ *&&&Ͱ͍͏ྨΛऔಘ ਖ਼نԽͳΒਅʢ͍ͳ·ؚʣ ɾਖ਼نԽɾඇਖ਼نԽͳΒਅ ͳΒਅ ඇਖ਼ͳنΒਅʢ͍ͳ·ؚʣ ແݶେͳΒਅ ඇ T/B/ R/B/ ͳΒਅ TJHOBMJOH/B/ T/B/ ͳΒਅ ਖ਼४ ܗʁ ͳΒਅ
'MPBUJOH1PJOUͷෳࡶԽ ಛघͷऔಘ ⾣ *&&&ͷಛघΛऔಘՄೳ ⾣ 4XJGUΑΓ૿͑ɺදهݟ͞Εͨ ߲ TUBUJDWBSJOGJOJUZ4FMG WBSOBO4FMG WBSTJHOBMJOH/B/#PPM TUBUJDWBSQJ4FMG ༻్ 㱣 RVJFU/B/ 4JHOBMJOH/B/ ԁप
'MPBUJOH1PJOUͷෳࡶԽ ߏཁૉͷ֬ೝ ⾣ ԾɾجɾࢦΛऔಘͰ͖ΔΑ͏ʹͳͬͨ ⾣ දؔ͢ʹݱΔ۩ମతͳใऔಘՄೳ ߲ WBSTJHO'MPBUJOH1PJOU4JHO WBSTJHOJpDBOE4FMG WBSFYQPOFOU&YQPOFOU TUBUJDWBSSBEJY*OU TUBUJDWBSHSFBUFTU'JOJUF.BHOJUVEF4FMG TUBUJDWBSMFBTU/PSNBM.BHOJUVEF4FMG TUBUJDWBSMFBTU/PO[FSP.BHOJUVEF#PPM ༻్ ͷූ߸ Ծ෦ͷදݱ ࢦ෦ ج औΓಘΔ࠷େ ࠷খ͍͞ਖ਼نԽ ࠷̌ʹ͍ۙ
'MPBUJOH1PJOUͷෳࡶԽ લޙͷදݱ ⾣ ࣍ʹද͖ͰݱΔΛऔಘՄೳ ⾣ ͍ͣͿΜͱ۩ମతͳૢ࡞͕Ͱ͖Δʜʁ ߲ ༻్ TUBUJDWBSVMQ0G0OF4FMG ͷ࣍ͷͱͷࠩ WBSVMQ4FMG WBSOFYU6Q4FMG WBSOFYU%PXO4FMG ࣍ͷͱͷࠩ ແݶେͷ࣍ͱͷࠩ/B/ ࣍ʹେ͖͍ HSFBUFTU'JOJUF.BHOJUVEFͷ࣍㱣 ࣍ʹখ͍͞ MFBTU/PO[FSP.BHOJUVEFͷ࣍
'MPBUJOH1PJOUͷෳࡶԽ ԋࢉػೳ ⾣ ϓϩτίϧʹԋࢉػೳ͕نఆ͞ΕΔ ⾣ ಉ༷ʹɺαΠυΤϑΣΫτ൛ଘࡏ͢Δ ߲ GVODOFHBUFE 4FMG GVODBEEJOH @4FMG 4FMG GVODTVCUSBDUJOH @4FMG 4FMG GVODNVMUJQMJFE CZ4FMG 4FMG GVODEJWJEFE CZ4FMG 4FMG GVODSFNBJOEFS EJWJEJOH#Z4FMG 4FMG GVODUSVODBUJOH3FNBJOEFS EJWJEJOH#Z4FMG 4FMG GVODTRVBSF3PPU EJWJEJOH#Z4FMG 4FMG GVODBEEJOH1SPEVDU @4FMG @4FMG 4FMG ༻్ ූ߸స Ճࢉ ࢉݮ ࢉ আࢉ ༨ ༨ʢΛઈରํʹ Γࣺͯͨͱ͖ͷ༨ʣ ฏํࠜ ֻ͚߹ΘͤɺՃࢉ
'MPBUJOH1PJOUͷෳࡶԽ ΛؙΊΔػೳ ⾣ ΛؙΊΔػೳ͕نఆ͞Ε͍ͯΔ ⾣ ಉ༷ʹɺαΠυΤϑΣΫτ൛ଘࡏ͢Δ ߲ GVODSPVOEFE @'MPBUJOH1PJOU3PVOEJOH3VMF #PPM GVODSPVOEFE 4FMG ؙΊํ ࢦఆͷํ๏ ࢛ࣺޒೖ 'MPBUJOH1PJOU3PVOEJOH3VMF ؙΊํ UP/FBSFTU0S"XBZ'SPN;FSP UP/FBSFTU0S&WFO VQ EPXO UPXBSE;FSP BXBZ'SPN;FSP ༰ ͔Βԕ͔͟Δํʹɺ࢛ࣺޒೖ ࢛ࣺɺޒͳʹۮΔํʹؙΊΔ తʹେ͖͍ํʹɺΓ্͛ తʹখ͍͞ํʹɺΓԼ͛ ઈରతʹখ͍͞ํʹɺΓԼ͛ ઈରతʹେ͖͍ํʹɺΓ্͛
'MPBUJOH1PJOUͷෳࡶԽ Λൺͯબ͢Δ ⾣ ϓϩτίϧʹԋࢉػೳ͕نఆ͞ΕΔ ⾣ ಉ༷ʹɺαΠυΤϑΣΫτ൛ଘࡏ͢Δ ߲ TUBUJDGVODNJOJNVN @4FMG @4FMG 4FMG TUBUJDGVODNBYJNVN @4FMG @4FMG 4FMG TUBUJDGVODNJOJNVN.BHOJUVEF @4FMG @4FMG 4FMG TUBUJDGVODNBYJNVN.BHOJUVEF @4FMG @4FMG 4FMG ༻్ খ͍͞ํΛऔಘ େ͖͍ํΛऔಘ ઈରతʹখ͍͞ํΛऔಘ ઈରతʹେ͖͍ํΛऔಘ
'MPBUJOH1PJOUͷෳࡶԽ ൺֱػೳ ⾣ ϓϩτίϧʹൺֱԋࢉ༻ͷ͕ؔنఆ͞ΕΔ ⾣ ͳͥɺԋࢉࢠΛఆٛ͠ͳ͍ΜͩΖ͏ʁ ߲ GVODJT&RVBM UP4FMG #PPM GVODJT-FTT UIBO4FMG #PPM GVODJT-FTT5IBO0S&RVBM5P @4FMG #PPM GVODJT5PUBMMZ0SEFSFE CFMPX0S&RVBM5P4FMG #PPM ༻్ ൺֱ ൺֱ ൺֱ /B/Λߟྀͨ͠ ൺֱ 'MPBUJOH1PJOUରԠͷԋࢉࢠʢάϩʔόϧؔʣ +, -, *, /, +=, -=, *=, /=, ==, <<, <=, >, >=
'MPBUJOH1PJOUͷෳࡶԽ
/B/ΛؚΉྻʹҙ
⾣ /B/͕͋Δͱɺඪ४TPSUͰਖ਼͘͠ฒͳ͍
⾣ JT5PUBMMZ0SEFSFE CFMPX0S&RVBM5P Λ͏ʜʂ
let values = [1.8, 4.6, -5.0, .nan, 3.7, -4.6]
// 以下の結果 >> [-5, 1.8, 4.6, nan, -4.6, 3.7]
values.sorted()
// 以下の結果 >> [-5, -4.6, 1.8, 3.7, 4.6, nan]
values.sorted {
$0.isTotallyOrdered(belowOrEqualTo: $1)
}
ුಈখʜ ͪΌΜͱͬͯ͜Εͯͨͱ͔ɺح
ͪͳΈʹ4XJGUͰେมͩͬͨ TJHOBMJOH/B/࠷େͷऔಘʁ
'MPBUJOH1PJOUͷෳࡶԽ 4JHOBMJOH/B/ͷੜJO4XJGU ⾣ 'MPBUJOH1PJOUϓϩτίϧͷTJHOBMJOH/B/Λࢀর ⾣ దͳ4JHOBMJOH/B/ΛऔಘͰ͖Δ // Float 型の Signaling NaN を作る var sNaN = Float.signalingNaN
'MPBUJOH1PJOUͷෳࡶԽ ࠷େͷੜJO4XJGU ⾣ 'MPBUJOH1PJOUͷHSFBUFTU'JOJUF.BHOJUVEFΛࢀর ⾣ දݱՄೳͳ࠷େΛऔಘͰ͖Δʢ͜ͷ͕࣍ແݶେʣ // Float 型の最大値を作る var max = Float.greatestFiniteMagnitude
'MPBUJOH1PJOUϓϩτίϧ ͜ΕͰͻͱ௨ΓɺཧղͰ͖ͨʜʁ
#JOBSZ'MPBUJOH1PJOUϓϩτίϧ
#JOBSZ'MPBUJOH1PJOU #JOBSZ'MPBUJOH1PJOUͷ֓ཁ ⾣ ʹجಛԽͨ͠'MPBUJOH1PJOU ⾣ ੑ࣭ͷ֦ு w 'MPBUJOH1PJOUΛܧঝ w খϦςϥϧʹରԠ ⾣ ػೳՃ w Ϗοτૢ࡞ػೳͷఏڙ
#JOBSZ'MPBUJOH1PJOU ४͢ڌΔϓϩτίϧ ⾣ 'MPBUJOH1PJOUΛ͞ΒʹػೳڧԽ ⾣ Կ͔͜͜ނΒ&YQSFTTJCMF#Z'MPBU-JUFSBMʹରԠʜʁ ߲ 'MPBUJOH1PJOU &YQSFTTJCMF#Z'MPBU-JUFSBM ༻్ *&&&ුಈখ খϦςϥϧͰදݱՄೳ
#JOBSZ'MPBUJOH1PJOU ුಈখ͔ܕΒͷม ⾣ ֤छුಈখ͔ܕΒͷมΠχγϟϥΠβΛنఆ ⾣ ͳͥɺ͜͜ʹ͖ͯුಈখܕΛαϙʔτʁ init(_ value: Float) init(_ value: Double) init(_ value: Float80) // Float80 は macOS のみ
#JOBSZ'MPBUJOH1PJOU ༰ΛϏοτͰࢦఆͯ͠ੜ ࢦ ⾣ *&&&ුಈখͰදݱ Ծ ج ⾣ ߏཁૉΛϏοτύλʔϯͰࢦఆͰ͖Δ associatedtype RawSignificand : UnsignedInteger associatedtype RawExponent : UnsignedInteger // IEEE 754 の仕様に基づき、ビットを指定する init(sign: FloatingPointSign, exponentBitPattern: RawExponent, significandBitPattern: RawSignificand)
#JOBSZ'MPBUJOH1PJOU ୯ਫ਼ුಈখʢ֓ཁʣ ⾣ ූ߸ʜTJHO w CJU ⾣ ࢦʜFYQPOFOU w CJU w FYQPOFOU ⾣ ԾʜGSBDUJPO w CJU ҉CJU w ࠷ॳΛͱΈͳͯ͠ɺΓͷখҎԼΛදݱ w ઌ಄Ϗοτ͕ʹͳΔΑ͏ʹਖ਼نԽ ⾣ ࢦͱԾͷΈ߹ΘͤͰɺඇແݶେΛදݱ
#JOBSZ'MPBUJOH1PJOU ୯ਫ਼ුಈখͷσʔλߏ ⾣ Ծɾࢦɾූ߸ɺͦΕͧΕ༻ͷϑΟʔϧυ͕͋Δ ⾣ Ծͱࢦͷ༰ͰɺಛघͳΛද͖ͰݱΔ ୯ਫ਼ුಈখ'MPBUͷ߹ ࢦ෦ ʙ Ծ෦ খҎԼͷ খҎԼͷ Ҏ֎ ༻్ θϩ ඇਖ਼نԽʢ0.Ծºʣ ਖ਼نԽʢ1.Ծºࢦʣ ແݶେ ඇ
#JOBSZ'MPBUJOH1PJOU Ϗοτใͷऔಘ ⾣ ۩ମతͳϏοτදݱͷํΛऔಘՄೳ ⾣ ͔ͭͯͳ͘۩ମతʹنఆ͞Ε͍ͯΔҹʜ ߲ TUBUJDWBSFYQPOFOU#JU$PVOU *OU TUBUJDWBSTJHOJpDBOE#JU$PVOU *OU WBSFYQPOFOU#JU1BUUFSO 3BX&YQPOFOU ༻్ WBSTJHOJpDBOE#JU1BUUFSO 3BX4JHOJpDBOE Ծ෦ͷϏοτύλʔϯ ෦Ϗοτআ͘ WBSTJHOJpDBOE8JEUI*OU WBSCJOBEF4FMG ࢦ෦ͷϏοτ Ծ෦ͷϏοτ ෦Ϗοτআ͘ ࢦ෦ͷϏοτύλʔϯ Ծ෦ͷ༗ޮϏοτΛ ࠨଆ͔ΒΧϯτʢ㱠༗ޮܻʣ 1.0 2ࢦ Λऔಘ
͜Μͳػೳɺ͏ͷ͔ͳʁ
ͳΜͰ'MPBUJOH1PJOUͱผʹ #JOBSZ'MPBUJOH1PJOU͕ଘࡏ͢ΔͷͩΖ͏ʁ
Ṗ ਂ·Δ͔Γ
͋Δͷग़དྷࣄ
'MPBU %PVCMFQJ ͱ'MPBUQJ͕ Ұக͢Δ
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ !SBZpY͞Μͷ ⾣ 'MPBUQJΛ'MPBUʹܕม'ͰMPBUQJͱҰக ⾣ ਫ਼ͷ͍ํ͔Βߴ͍ํมͯ͠ɺͳͥҰக͢Δʁ let pi80 = Float80.pi let pi64 = Double.pi let pi32 = Float.pi // 3.141592653589793116 // 3.141592653589793 // 3.141593 pi80 == Float80(pi64) pi80 == Float80(pi32) // true // false
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ ԁप К ͷԾʁ ⾣ ख͕͔ΓΛ௫Έͨͯ͘ɺԾ෦Λ֬ೝ ⾣ ͜Ε͚ͩͰɺख͕͔ΓΛ௫Ίͣʜ pi80.significand pi80.exponent // 1.570796326794896558 // 1 pi64.significand pi64.exponent // 1.570796326794897 // 1 pi32.significand pi32.exponent // 1.570796 // 1 significand 2exponent
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ ුಈখͷਫ਼ʁ ⾣ ख͕͔ΓΛ௫Έͨͯ͘ɺਫ਼Λ֬ೝ ⾣ 'MPBU͕'MPBUΑΓਫ਼ߴͯؒ͘ҧ͍ͳ͍༷ࢠʁ Float80.significandBitCount Float80.exponentBitCount // 小数部 … 63 bit // 仮数部 … 15 bit Float64.significandBitCount Float64.exponentBitCount // 小数部 … 52 bit // 仮数部 … 11 bit Float32.significandBitCount Float32.exponentBitCount // 小数部 … 23 bit // 仮数部 … 8 bit
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ ߹ܭϏοτ͕߹Θͳ͍ͷʁ ⾣ *&&&ͷ༷͕Ө͢ڹΔ༷ࢠ ⾣ ූ߸Ϗοτͱɺ'MPBU෦Ϗοτ͕ଘࡏ͢Δ ܕ ߹ܭ ූ߸෦ TJHO FYQPOFOU JOUFHFS GSBDUJPO 'MPBU CJU CJU CJU CJU CJU 'MPBU CJU CJU CJU CJU CJU 'MPBU CJU CJU CJU CJU CJU ⾣ ࢦ෦ ෦ ෦ਖ਼نԽʹΑΓɺݪଇͱͯ͠ʹͳΔ খ෦
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ ුಈখͷਖ਼نԽͱʁ ⾣ ෦ද ͕ݱn.xxxxʹͳΔΑ͏σʔλΛ͑Δ ⾣ ඍখΛද͢ݱΔͨΊʹɺඇਖ਼نԽ0.xxxx͋Δ *&&&ͷਖ਼نԽʹ͍ͭͯ ⾣ ෦͕Ҏ֎ʹͳΔΑ͏ʹ͢Δ w ⾣ ͭ·ΓºͳΒºʹ͢Δ ෦͕ਐදͳ ݱΒʜ w w w ෦͕Ҏ֎ͱ͍͏͜ͱɺͭ·Γʹܾ·Δ ਖ਼نԽΛଋ͢Εɺ෦লུͰ͖Δ σʔλΛϏοτઅͰ͖Δ
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ ԁप К ͷԾϏοτʁ ⾣ Կ͔௫Ίͦ͏ͳ͕ͯ͠ؾɺԾ෦ϏοτΛ֬ೝ ⾣ ্ҐϏοτ͔ΒॱʹҰக͍ͯ͠Δ /* pi80 仮数: 100100100001111110110101010001000100001011010001100000000000000 pi64 仮数: 1001001000011111101101010100010001000010110100011000 pi80 指数: 100000000000000 pi64 指数: 10000000000 */ String(pi80.significandBitPattern, radix: 2) String(pi80.exponentBitPattern, radix: 2) String(pi64.significandBitPattern, radix: 2) String(pi64.exponentBitPattern, radix: 2)
'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ ਖ਼نԽͰɺͨ·ͨ·Ұகʂ ⾣ ਖ਼نԽʹΑΓɺԾ෦͕ࠨγϑτ͞Εͨ ⾣ Γͷ෦͕શͯθϩͰɺͨ·ͨ·Ұகͨ͠ Float80.pi.significandBitPattern 100100100001111110110101010001000100001011010001100000000000000 Float64.pi.significandBitPattern 1001001000011111101101010100010001000010110100011000 Float32.pi.significandBitPattern 10010010000111111011010
৽ઃ͞Εͨ'MPBUJOH1PJOUػೳ ʹཱͬͨΑ͏ͩʜʁ
ͦͯ͠ɺਖ਼نԽ͔Β࿈͢Δ͜ͱ
·ͱΊ ਖ਼نԽʹࢥ͏͜ͱ ਖ਼نԽɺ෦ΛҎ֎ʹ͢Δ͜ͱ ⾣ w ෦͕ਐදͳ ݱΒ ⾣ w ෦ඞͣʹͳΔ w ਖ਼نԽΛଋͯ͠ɺ෦Λলུ ਐදͰݱਖ਼نԽલఏͱ͢Εɺ ⾣ ⾣ ºˠº w ༷ʹԊͬͨߴͳૢ࡞͕ߦ͑ΔΑ͏ʹͳΔʁ w ۩ମతͳಈ͖Λϓϩτίϧ͚ͩͰ࣮Ͱ͖Δʁ ͦͷͨΊͷ#JOBSZ'MPBUJOH1PJOUͳͷ͔ʁ
ϓϩτίϧΛl࣮z͢Δ࣌౸དྷʁ
ͦͯ͠ഭΓدΔ 1SPUPDPM0SJFOUFE*OUFHFSTͷԻʜ ⾣ Λੑ࣭Ͱ໌֬ʹ ⾣ ੑ࣭ຖͷػೳΛ໌֬Խ ⾣ ݻఆ̎ਐදݱ Έ͍ͨͳγϑτ͕ՄೳʹͳΔ 4&"DDFQUFE
&OKPZ4XJGU UPCFDPOUJOVFE 1SPUPDPM0SJFOUFE1SPHSBNNJOH ເͱ࣮ݱͷؒڱ &;/&5۽୩༑ IUUQF[OFUKQ ⾣ #PPMFBO5ZQFফ໓ͷߟ ⾣ 'MPBUJOH1PJOU؍ ⾣ 'MPBU %PVCMFQJ ͷূݕ