On 2014-05-05 at 16:01:02 +0800 GMT, Joseph Wright wrote:
> On 05/05/2014 00:08, Heiko Oberdiek wrote:
>> Hello,
>>
>> macro \__dim_strip_bp:n is defined in l3skip.dtx the following way:
>>
>>    \cs_new:Npn \__dim_strip_bp:n #1
>>      { \__dim_strip_pt:n { 0.996 26 \__dim_eval:w #1 \__dim_eval_end: } }
>>
>> The calculation from bp to bp is essentially:
>>
>>      \dimexpr 0.99626\dimexpr #1\relax\relax
>>
>> Of course, there will always be rounding errors, but the code
>> can be improved by a scaling operation inside e-TeX's \dimexpr,
>> from "The e-TeX manual":
>>
>> | The arithmetic operations are performed individually, except
>> | for ‘scaling’ operations (a multiplication immediately followed
>> | by a division) which are performed as one combined operation
>> | with a 64-bit product as intermediate value.
>>
>> Improved version with higher precision:
>>
>>    \cs_new:Npn \__dim_strip_bp:n #1
>>      {
>>        \__dim_strip_pt:n
>>          {
>>            \__dim_eval:w ( #1 ) * 800 / 803 \__dim_eval_end:
>>          }
>>      }
>>
>> * 800/803 is the integer fraction for 72/72.27
>> * The parentheses around #1 ensure, that #1 is
>>    calculated first.
>>
>> Yours sincerely
>>    Heiko Oberdiek
>>
>
> Altered in the trunk: will feature in the next release.
> --
> Joseph Wright
>

Hello,

The new definition will be broken if its argument contains additional units. E.g.,

     \__dim_strip_bp:n { 1 bp pt }

So I think the proper definition is similarly:

     \cs_new:Npn \@@_strip_bp:n #1
       {
         \@@_strip_pt:n
           { \@@_strip_pt:n {#1} pt * 800 / 803 \@@_eval_end: }
       }

Best Regards,
Qing Lee