<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div><blockquote type="cite" class=""><div class="">On Jun 19, 2017, at 5:43 PM, David Sweeris <<a href="mailto:davesweeris@mac.com" class="">davesweeris@mac.com</a>> wrote:</div><div class=""><div dir="auto" class=""><div class=""><div class="">Sent from my iPhone</div>On Jun 19, 2017, at 13:44, John McCall via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div class=""><blockquote type="cite" class=""><div class="">On Jun 19, 2017, at 1:58 PM, Stephen Canon via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><blockquote type="cite" class="">On Jun 19, 2017, at 11:46 AM, Ted F.A. van Gaalen via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:<br class=""></blockquote><div class=""><blockquote type="cite" class=""><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class="Apple-interchange-newline">var result: Float = 0.0</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">result = float * integer * uint8 + double </div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">// here, all operands should be implicitly promoted to Double before the complete expression evaluation.</div></div></blockquote></div><br class=""><div class="">You would have this produce different results than:</div><div class=""><br class=""></div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let temp = float * integer * uint8</div><div class=""><span class="Apple-tab-span" style="white-space:pre">        </span>result = temp + double</div><div class=""><br class=""></div><div class="">That would be extremely surprising to many unsuspecting users.</div><div class=""><br class=""></div><div class="">Don’t get me wrong; I *really want* implicit promotions (I proposed one scheme for them way back when Swift was first unveiled publicly).</div></div></div></blockquote><div class=""><br class=""></div></div>I don't! At least not for floating point. It is important for both reliable behavior and performance that programmers understand and minimize the conversions they do between different floating-point types.</div></blockquote><br class=""><div class="">How expensive is it?</div></div></div></blockquote><br class=""></div><div>If memory serves, it's not usually ruinously expensive on its own, but there tend to not be very many functional units for it, and it doesn't get pipelined very well. Essentially, micro-architects often assume that well-written FP code is not doing a significant number of FP conversions. Even if it were very cheap, it would still be an unnecessary operation in the pipeline.</div><div><br class=""></div><div>It's a well-known source of performance bugs in C to accidentally use 1.0 instead of 1.0f in the middle of some complex expression that's heavily working with floats. A bunch of intermediate computations ends up getting done in double, and unlike the analogous situation with integers, it's not really possible for the compiler to automatically figure out that it can do them in float instead.</div><br class=""><div class="">John.</div></body></html>