If BinaryFloatingPoint had init(_: RawSignificand), you could also just write:
extension BinaryFloatingPoint { init(unitRangeFromRawSignificand s: RawSignificand) { self = Self(s) * .ulpOfOne } } (this is why I ask if RawSignificand is really the type you want; if you use some concrete integer type this will work). But once we have all the new integer protocol conformances, we’ll have a generic init from any integer type (this was already reviewed for FloatingPoint, but isn’t implementable without the Integer support), which will also make this possible. > On Aug 26, 2016, at 7:47 PM, Stephen Canon via swift-dev > <swift-dev@swift.org> wrote: > > Assuming RawSignificand really is the type you want, I think this does what > you’re looking for? > > protocol BinaryFloatingPointWithBitPattern: BinaryFloatingPoint { > init(bitPattern: RawSignificand) > var bitPattern: RawSignificand { get } > } > > extension Float: BinaryFloatingPointWithBitPattern { } > extension Double: BinaryFloatingPointWithBitPattern { } > > extension BinaryFloatingPointWithBitPattern { > init(unitRangeFromRawSignificand s: RawSignificand) { > self = Self(bitPattern: Self(1).bitPattern | s) - 1 > } > } > >> On Aug 26, 2016, at 7:38 PM, Stephen Canon via swift-dev >> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote: >> >> Where does your RawSignificand input come from? Is that really the type >> that you want? >> >> I don’t think you really need very much boilerplate at all here. >> >>> On Aug 26, 2016, at 7:30 PM, Jens Persson <j...@bitcycle.com >>> <mailto:j...@bitcycle.com>> wrote: >>> >>> I understand. >>> It's just very tempting to try and use the new static computed properties >>> for eg 23 and 52 etc. >>> I guess I'll just have to write a lot of boilerplate, or perhaps a protocol >>> that is just implemented by Double and Float (that will be very similar to >>> BinaryFloatingPoint in a lot of ways). >>> /Jens >>> >>> On Sat, Aug 27, 2016 at 1:25 AM, Stephen Canon <sca...@apple.com> wrote: >>> This doesn’t really scale up very well, though. BinaryFloatingPoint needs >>> to also be able to model e.g. Float2048 or similar; we generally don't want >>> to require that RawExponent to be the same type as RawSignificand (which I >>> think is what you’re really suggesting), because in typical bignum usage >>> significands are much larger than exponents. >>> >>> It sounds like maybe you actually want to be operating directly on >>> bitPatterns, rather than the abstract fields of the types. >>> >>> – Steve >>> >>>> On Aug 26, 2016, at 7:21 PM, Jens Persson <j...@bitcycle.com> wrote: >>>> >>>> Oh, to more directly answer your question: I don't like having to create a >>>> UInt (UInt64) value when all my bit manipulaton code happens in UInt32 >>>> (for Float) for example. >>>> >>>> The most probable context for using these computed properties and types of >>>> BinaryFloatingPoint is one in which specific fixed width types really >>>> matters a lot (look at the name of the protocol and the properties and >>>> assocated types we are talking about). >>>> >>>> /Jens >>>> >>>> >>>> On Sat, Aug 27, 2016 at 1:15 AM, Jens Persson <j...@bitcycle.com> wrote: >>>> Reason for asking is that I have this: >>>> >>>> extension Double { >>>> init(unitRangeFromRawSignificand s: RawSignificand) { >>>> let bitPattern = s | (1023 << 52) >>>> self = unsafeBitCast(bitPattern, to: Double.self) - 1.0 >>>> } >>>> } >>>> extension Float { >>>> init(unitRangeFromRawSignificand s: RawSignificand) { >>>> let bitPattern = s | (127 << 23) >>>> self = unsafeBitCast(bitPattern, to: Float.self) - 1.0 >>>> } >>>> } >>>> >>>> But they would be better as: >>>> extension BinaryFloatingPoint { >>>> init(unitRangeFromRawSignificand s: RawSignificand) { >>>> ... problems here, have to try casting things into >>>> RawSignificand's type ... >>>> } >>>> } >>>> >>>> Please have a go at that and perhaps you see what I mean or you will come >>>> up with a nice solution that I have missed. (Speed is very important btw.) >>>> >>>> /Jens >>>> >>>> >>>> On Sat, Aug 27, 2016 at 1:02 AM, Stephen Canon <sca...@apple.com> wrote: >>>> > On Aug 26, 2016, at 6:06 PM, Jens Persson via swift-dev >>>> > <swift-dev@swift.org> wrote: >>>> > >>>> > I can understand why >>>> > Double.RawSignificand is UInt64 >>>> > and >>>> > Float.RawSignificand is UInt32 >>>> > >>>> > But I can't understand why both >>>> > Double.RawExponent >>>> > and >>>> > Float.RawExponent >>>> > should be UInt. >>>> > >>>> > Why aren't they also just UInt64 and UInt32, resp.? >>>> >>>> Let me flip the question: why would they be UInt64 and UInt32? Absent a >>>> reason to prefer a specific fixed-with type, Swift integers should >>>> generally default to being [U]Int (and ideally Int, but RawExponent is >>>> Unsigned). >>>> >>>> – Steve >>>> >>>> >>> >>> >> >> _______________________________________________ >> swift-dev mailing list >> swift-dev@swift.org <mailto:swift-dev@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-dev > > _______________________________________________ > swift-dev mailing list > swift-dev@swift.org > https://lists.swift.org/mailman/listinfo/swift-dev
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev