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 
> <mailto: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 
>> <mailto: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 
>> <mailto: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 
>> <mailto:sca...@apple.com>> wrote:
>> > On Aug 26, 2016, at 6:06 PM, Jens Persson via swift-dev 
>> > <swift-dev@swift.org <mailto: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

Reply via email to