[Proposal: 
https://github.com/apple/swift-evolution/blob/master/proposals/0067-floating-point-protocols.md
 
<https://github.com/apple/swift-evolution/blob/master/proposals/0067-floating-point-protocols.md>]

This is super impressive. I do have several bits I’m uncomfortable with, 
however. I’ll try to separate that into “semantic” and “naming” sections.

Semantic

static var radix: Int { get }

Does it ever make sense to have a model type that allows different instances to 
have different radices?

Is there an algorithm that makes use of a model’s radix, or is this just in 
here for “completeness”?


  /// A signaling NaN (not-a-number).
  @warn_unused_result
  static func signalingNaN: Self { get }

I’m not sure it really makes sense for a Bignum / APFloat type to support such 
a value. But really I think this is just underspecified. What does it mean, in 
terms of this protocol and its uses, for a NaN to be signaling? Is it just a 
specific “color" of NaN, with no semantic requirements other than being 
distinguishable?

(Also, is ‘signalingNan.isNan’ true? I assume so but since ’nan’ is implied to 
be a non-signaling NaN I’m not sure anymore.)


  var signBit: Bool { get }

Unlike Chris, I’m strongly against this property as it stands. You should not 
be able to write “if someValue.signBit”; a bit is not a boolean value. 
(Citation: "Uses of Boolean methods and properties should read as assertions 
about the receiver 
<https://swift.org/documentation/api-design-guidelines/#strive-for-fluent-usage>.”)

I’d be okay with Greg’s idea of changing the type to an enum. I’d also be okay 
with renaming this to a predicate, whatever the name ends up being. 
(“isSignBitSet”, “isSignNegative”, etc.)


  var exponent: Int { get }

Nitpick: it’s probably worth noting in the doc comment that this is the 
unbiased exponent value.

Also, does it matter that this is insufficient for bignums, which may have an 
exponent of greater than `sizeof(Int.self)` bits? (This is also a concern for a 
number of members of BinaryFloatingPoint, like ‘significantBitCount'.)


Naming

On “NaN” vs. “Nan”: I’m not convinced that ignoring the case is the right way 
to go here. IMHO the clearest lowercase form is “nan” and the clearest 
capitalized form is “NaN”.

The current draft API guidelines 
<https://swift.org/documentation/api-design-guidelines/#general-conventions> 
don’t cover this case, but if I were to add something for this, I’d say “when a 
word is normally written with mixed case, the lowercase form should be 
fully-lowercased if the first letter is naturally uppercase, and the 
capitalized form should have the first letter uppercased only.” That rule 
produces “iPhone/IPhone”, “next/NeXT”, and “nan/NaN”. (The “if the first letter 
is naturally uppercase” could be thrown out as well.)


On 'isLessThanOrEqual(to:)’: I agree with Xiaodi that the argument label is 
problematic here. I think the problem is that we have two prepositions that 
apply to the argument, and “pick the second one” leaves the base name feeling 
unbalanced. (Remember that we allow referring to a method by its basename alone 
when using it as a function value.)


On 'isTotallyOrdered(with:)’: I lost track of who said it, but I agree that 
this sounds like it’s “!isUnordered(with: other)”. The only name that’s coming 
to mind is ‘isTotallyOrderedBefore(_:)’, which isn’t great.


On ‘binade’: At first I thought this was a confusing term and there had to be a 
better one, but now I think it’s an “if you don’t know what this is, you don’t 
need to use it” case. :-)


Jordan
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to