[swift-evolution] [Discussion] Arbitrary precision integer and float literal protocols

David Sweeris davesweeris at mac.com
Thu Mar 30 21:21:46 CDT 2017




Sent from my iPhone
> On Mar 30, 2017, at 14:56, David Hart via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Hello swift-evolution,
> 
> I’m working on a proposal for arbitrary precision integer and float literal protocols to complement ExpressibleByIntegerLiteral and ExpressibleByFloatLiteral. I’m looking for feedback and help in verifying the logic - I have doubts about endianness.
> 
> Fire away!
> 
> https://github.com/hartbit/swift-evolution/blob/arbitrary-precision-integer-float-protocol/proposals/XXXX-arbitrary-precision-integer-float-literal-protocols.md
> 
> Arbitrary precision integer and float literal procotols
> Proposal: SE-XXXX
> Authors: David Hart
> Review Manager: TBD
> Status: TBD
> Introduction
> 
> We propose a pair of protocols extending ExpressibleByIntegerLiteral and ExpressibleByFloatLiteral to allow initializing conforming types with arbitrary precision integer and floating-point literals.
> 
> Motivation
> 
> The current protocols ExpressibleByIntegerLiteral and ExpressibleByFloatLiteral are simple and work well but don't support arbitrary precision literal values. Replacing those protocols is a non-goal as they provide a simple interface for work well for most cases. Therefore, to support initializing big integer and big float types with literal values, we need new protocols.
> 
> Proposed solution
> 
> We propose:
> 
> renaming FloatingPointSign into Sign,
> introducing a ExpressibleByArbitraryPrecisionIntegerLiteral protocol that extends ExpressibleByIntegerLiteral and provides a new arbitrary precision initializer,
> introducing a ExpressibleByArbitraryPrecisionFloatLiteral protocol that extends ExpressibleByFloatLiteral and provides a new arbitrary precision initializer.
> Here is the corresponding code:
> 
> /// The sign of a number.
> public enum Sign : Int {
>     
>     /// The sign for a positive value.
>     case plus
>     
>     /// The sign for a negative value.
>     case minus
> }
> 
> /// A type that can be initialized with an arbitrary precision integer literal.
> public protocol ExpressibleByArbitraryPrecisionIntegerLiteral:
>     ExpressibleByIntegerLiteral {
>     
>     /// Creates an instance initialized with the sign and memory value of the
>     /// arbitrary precision integer literal.
>     ///
>     /// Do not call this initializer directly. Instead, initialize a variable or
>     /// constant using an arbitrary precision integer literal. For example:
>     ///
>     ///     let x = 123_456_789_123_456_789_123_456_789
>     ///
>     /// In this example, the assignment to the `x` constant calls this integer
>     /// literal initializer behind the scenes with `sign` as `.plus` and
>     /// `buffer` as the memory [0x0000000000661EFD, 0xF2E3B19F7C045F15].
>     ///
>     /// - Parameters:
>     ///     sign: The sign of the integer value.
>     ///     buffer: The memory value of the integer.
>     init(sign: Sign, buffer: UnsafeBufferPointer<UInt64>)
> }
> 
> /// A type that can be initialized with an arbitrary precision float literal.
> public protocol ExpressibleByArbitraryPrecisionFloatLiteral:
>     ExpressibleByFloatLiteral {
>     
>     /// Creates an instance initialized with the sign, exponent and
>     /// significand of the arbitrary precision float literal.
>     ///
>     /// Do not call this initializer directly. Instead, initialize a variable or
>     /// constant using an arbitrary precision integer literal. For example:
>     ///
>     ///     let x = 123_456_789_123_456.789_123_456_789
>     ///
>     /// In this example, the assignment to the `x` constant calls this float
>     /// literal initializer behind the scenes with `sign` as `.plus`, `exponent`
>     /// as the memory [0x0000000000661EFD, 0xF2E3B19F7C045F15] and `significand`
>     /// with value [0x000000000000000C].
>     ///
>     /// - Parameters:
>     ///     sign: The sign of the integer value.
>     ///     exponent: The memory value of the exponent.
>     ///     significand: The memory value of the significand.
>     init(
>         sign: Sign,
>         exponent: UnsafeBufferPointer<UInt64>,
>         significand: UnsafeBufferPointer<UInt64>)
> }
> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

IIRC, some branches of math don't consider 0 to be positive or negative, so I might add a `zero` case in `Sign`.

Also, I'm not sure new protocols are actually necessary. I think I remember hearing somewhere that LLVM supports integer literals up to something like 400 bits? If so, we'd merely need a type that exposes those bytes to set the relevant types `IntegerLiteralType` associated type.

- Dave Sweeris 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170330/57423014/attachment.html>


More information about the swift-evolution mailing list