Re: [css-values] Concrete proposal for unit algebra in calc()

On 04/10/2014 05:20 PM, Tab Atkins Jr. wrote:
> On Thu, Apr 10, 2014 at 12:43 PM, Zack Weinberg <zackw@panix.com> wrote:
>>
>> In section 8.1.2 (type checking), replace the second two bullet points
>> in the list with the following:
[...]
> 
> So this does require you to manually keep the units singular, right?
> You're not allowed to write "calc(1px * 2px / 3px)", because due to
> order-of-operations you'll first evaluate the multiplication and hit
> clause 6.  You'd have to reorder to "calc(1px / 3px * 2px)" or add
> parens to "calc(1px * (2px / 3px))" to produce a valid expression,
> right?
>
> I'm okay with this, as it keeps the implementation much simpler, just
> making sure that's intended.

Right.  It simplifies the specification as well as the implementation,
and we can always relax it later if there's demand.

>>     If the value resulting from a complete `calc()` expression is
>>     infinite, it is clamped and becomes the most positive value
>>     allowed in the target context.
>>
>> | NOTE: This deliberately differs from the behavior specified in IEEE
>> | 754 in order to avoid introducing NaNs and negative zero into CSS,
>> | However, implementations using IEEE 754-conformant floating point
>> | arithmetic internally can produce the above semantics by treating
>> | -Inf, +Inf, and NaN as "infinite", and -0 as equivalent to +0.
> 
> This "most positive value" will be implementation-defined in most
> cases, as very few value contexts actually have an upper cap.  Is that
> acceptable?

I think it is.  I decided on this approach because I didn't want to
declare the property invalid at used-value time; I suspect that would be
seriously inconvenient for implementations.  So division by zero needs
to produce some definite value, and treating it as +Inf (which then gets
clipped to the maximum supported value) avoids a discontinuity with the
behavior when the denominator is very small but nonzero.

In practice, I think division by zero is more likely to happen because
some parameter under user control has been pushed outside a sensible
range (the font is made very small, or the window is made very narrow,
perhaps) than because of a flat-out mistake in the style sheet.  In that
light, the actual value chosen doesn't matter all that much.

zw

Received on Friday, 11 April 2014 01:15:10 UTC