> On Mar 30, 2016, at 12:26 AM, Xiaodi Wu via swift-evolution > <[email protected]> wrote: > > I didn't seem to ever need division. See attached playground (which > borrows shamelessly from existing code and Erica's proposal, and which > is written in Swift 2.2 because that's what I had handy).
Appending the following code to the playground reveals a bug/glitch: import Darwin let start = pow(2.0, 54) let end = nextafter(start, Double.infinity) let containsRepeatedValues = Array((start..<end).striding(by: 1.0)) print(containsRepeatedValues) //prints "[18014398509481984.0, 18014398509481984.0, 18014398509481984.0]\n" IMHO, this should be a bug, since the `FloatingPointStrideTo` init function has "stride != 0" as a precondition, and this behavior essentially breaks that. Although, having repeated values is probably preferable to getting in an infinite loop like this code does: let stridesForever = Array(start.stride(to: end, by: 1.0)) print(stridesForever) //prints, well, nothing because it strides forever and the playground never finishes running The problem in both cases is not enough floating point resolution. I see three potential solutions: 1) If a value repeats, end the sequence early. 2) If a value repeats, skip it. 3) Accept the practical reality that sometimes floating point types just can’t have nice things, and move them to a different protocol which makes the dangers more obvious. Thoughts? It seems to me that 1 & 2 both have unexpected behavior of their own, but I’m not sure it matters in practice. - Dave Sweeris
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
