[swift-dev] Why are BinaryFloatingPoint's RawSignificand and RawExponent different type?

Jens Persson jens at bitcycle.com
Fri Aug 26 18:15:44 CDT 2016


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 <scanon at apple.com> wrote:

> > On Aug 26, 2016, at 6:06 PM, Jens Persson via swift-dev <
> swift-dev at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160827/968a5ccd/attachment.html>


More information about the swift-dev mailing list