Asked by Adam Wozniak
on 19 Mar 2019

using matlab coder, the following is produced. real_T is a double precision floating point.

What is the significance of 3.3121686421112381E-170 ? Why was this specific number chosen, and not some other number?

/* Function for MATLAB Function: '<S1>/MATLAB Function' */

static real_T MyThing_norm(const real_T x[3])

{

real_T y;

real_T scale;

real_T absxk;

real_T t;

scale = 3.3121686421112381E-170;

absxk = fabs(x[0]);

if (absxk > 3.3121686421112381E-170) {

y = 1.0;

scale = absxk;

} else {

t = absxk / 3.3121686421112381E-170;

y = t * t;

}

absxk = fabs(x[1]);

if (absxk > scale) {

t = scale / absxk;

y = y * t * t + 1.0;

scale = absxk;

} else {

t = absxk / scale;

y += t * t;

}

absxk = fabs(x[2]);

if (absxk > scale) {

t = scale / absxk;

y = y * t * t + 1.0;

scale = absxk;

} else {

t = absxk / scale;

y += t * t;

}

return scale * sqrt(y);

}

Answer by Mike Hosea
on 20 Mar 2019

Edited by Mike Hosea
on 20 Mar 2019

Accepted Answer

Walter is on the right track.

What we see above is essentually a loop-unrolled version of the reference BLAS algorithm of DNRM2. The algorithm, having much longer vectors in mind, was designed to avoid unnecessary overflow and underflow while still making just one pass through the data. Unfortunately, the reference BLAS implementation asks whether abs(x(k)) ~= 0 in the loop. Floating point equality/inequality comparisons are not welcome when the generated code must adhere, say, to the MISRA standard, and calls to NORM are quite common, so we considered how to modify the algorithm without the ~= 0 comparisons.

The number in question is the largest initial value of the scale variable that guarantees that (abs(x(k))/scale)^2 does not underflow and is not denormal for any value of abs(x(k)) > 0, i.e. (abs(x(k))/scale)^2 >= realmin. Hence, the initial value of scale is eps*sqrt(realmin).

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 3 Comments

## Walter Roberson (view profile)

## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/451024-what-is-the-significance-of-3-3121686421112381e-170#comment_683098

## Adam Wozniak (view profile)

## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/451024-what-is-the-significance-of-3-3121686421112381e-170#comment_683118

## Walter Roberson (view profile)

## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/451024-what-is-the-significance-of-3-3121686421112381e-170#comment_683164

Sign in to comment.