[swift-evolution] [Discussion] Arbitrary precision integer and float literal protocols
Michel Fortin
michel.fortin at michelf.ca
Fri Mar 31 13:11:22 CDT 2017
I think you forgot to consider hexadecimal floating point literals. Those have a power-of-2 significand (instead of power-of-10). They can't be expressed by the `ExpressibleByArbitraryPrecisionFloatLiteral` protocol you're proposing.
> Le 30 mars 2017 à 17:56, David Hart via swift-evolution <swift-evolution at swift.org> a écrit :
>
> 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 <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 <https://github.com/hartbit/swift-evolution/blob/arbitrary-precision-integer-float-protocol/proposals/XXXX-arbitrary-precision-integer-float-literal-protocols.md>
> Authors: David Hart <https://github.com/hartbit>
> Review Manager: TBD
> Status: TBD
> <https://github.com/hartbit/swift-evolution/tree/arbitrary-precision-integer-float-protocol#introduction>Introduction
>
> We propose a pair of protocols extending ExpressibleByIntegerLiteral and ExpressibleByFloatLiteral to allow initializing conforming types with arbitrary precision integer and floating-point literals.
>
> <https://github.com/hartbit/swift-evolution/tree/arbitrary-precision-integer-float-protocol#motivation>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.
>
> <https://github.com/hartbit/swift-evolution/tree/arbitrary-precision-integer-float-protocol#proposed-solution>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
--
Michel Fortin
https://michelf.ca
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170331/be6e148c/attachment.html>
More information about the swift-evolution
mailing list