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> 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> 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 > https://lists.swift.org/mailman/listinfo/swift-dev
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev