- From: Zack Weinberg <zackw@panix.com>
- Date: Thu, 10 Apr 2014 15:43:51 -0400
- To: www-style list <www-style@w3.org>

I brought up the question of being able to divide two <length>s in calc() earlier this week, along with min/max expressions. I'm convinced min/max are Too Hard for right now, but I think it's not too hard to specify enough unit algebra to make <length> ratios feasible. Here is a concrete proposal relative to the current ED. In section 8.1.1 (calc() syntax): - product : unit [ S* [ "*" S* unit | "/" S* NUMBER ] ]*; + product : unit [ S* [ "*" S* unit | "/" S* unit ] ]*; In section 8.1.2 (type checking), replace the second two bullet points in the list with the following: * At '*', apply these rules in order: 1. If both sides are <integer>, resolve to <integer>. 2. If one side is <number> and the other is <number> or <integer>, resolve to <number>. 3. If one side is <number> or <integer> and the other is a _dimension_, resolve to the type of the _dimension_. 4. If one side is <time> and the other is <frequency>, resolve to <number>. 5. If one side is <length> and the other is <resolution>, resolve to <number>. 6. All other combinations of units are invalid. * At '/', apply these rules in order: 1. If both sides have the same type, resolve to <number>. 2. If the left side is a <number> or <integer> and the right side is also a <number> or <integer>, resolve to <number>. 3. If the left side is a _dimension_ and the right side is <number> or <integer>, resolve to the type of the _dimension_. 4. If the left side is a <number> or <integer> and the right side is a <length>, resolve to <resolution>. 5. If the left side is a <number> or <integer> and the right side is a <time>, resolve to <frequency>. 6. All other combinations of units are invalid. Also, replace from "Also, division by zero is invalid" through the end of that paragraph with: ... The expression is also invalid if it contains a division by zero which can be detected at parse time. For example, `calc(10px/0)` and `calc(10px/(1em - 1em))` are both invalid. However, `calc(10px/1em)` and `calc(10px/5%)` are *not* invalid, even though `1em` might evaluate to zero when the value is computed, and `5%` might evaluate to zero when the value is used. In section 8.1.3 (computed value), delete the note about the representation of a computed calc(), and perhaps also add some more examples. In section 8.1.4 (range checking), add immediately after "...to the range allowed in the target context": If a (sub-)expression contains a division by zero which was not detected at parse time, the value of that (sub-)expression is infinite. The result of any further computation on infinite values is also infinite, except that dividing any finite value by an infinite value produces zero. 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. That should be all that is required. zw

Received on Thursday, 10 April 2014 19:44:13 UTC