FLOAT
A double precision (64-bit) IEEE 754 floating point. The rounding mode is round to nearest.
Literals in base 10 may begin with an optional negative sign -,
followed by whole part, optionally followed by fractional part,
optionally followed by exponent where:
- Decimal digit: Characters
0through9. - Whole part: A nonempty sequence of decimal digits.
- Fractional part: A decimal point
.followed by nonempty sequence of decimal digits. - Exponent: An
emarker followed by optional-/+sign followed by nonempty sequence of decimal digits.
Literals in base 16 may begin with an optional negative sign -,
followed by hexadecimal base indicator 0x, followed by whole part,
optionally followed by fractional part, optionally followed by
exponent where:
- Hexadecimal digit: Decimal digit or letters
athroughfor lettersAthroughF. - Whole part: A nonempty sequence of hexadecimal digits.
- Fractional part: A decimal point
.followed by nonempty sequence of hexadecimal digits. - Exponent: A
pmarker followed by optional-/+sign followed by nonempty sequence of decimal digits. Note that the exponent is always given in base 10, even when the whole and fractional parts are in hexadecimal.
Hexadecimal floating point values are case insensitive.
Negative values are also permitted. The - forms part of literal
syntax.
Literals missing both the fractional part and the exponent will be interpreted as INTEGER literals, and implicit conversion to a FLOAT constant will be performed at compile time provided that the integer in question can be accurately represented as a FLOAT quantity. A compilation error is given if this conversion cannot be performed.
For example:
declare local var.f FLOAT;set var.f = 1.2;set var.f = 1.2e3;set var.f = -1.2e-3;set var.f = 1e3;set var.f = 0xA.B;set var.f = 0xA.Bp3;set var.f = -0xA.Bp-3;set var.f = 0xAp3;Floating point values are grouped into one of several classifications:
Finite —
math.is_finiteA value that is neither NaN nor an infinity.Subnormal —
math.is_subnormalThe FLOAT type supports subnormals (also known as denormals).NaN —
math.is_nanThe FLOAT type may express NaN (Not a Number). In general, arithmetic operations involving a NaN will produce NaN. NaN values are signaled through the"fastly.error"variable.There is no literal syntax for assigning NaN, but a
math.NANconstant is provided.Normal —
math.is_normalA value that is neither NaN, subnormal, an infinity nor a zero.Note that "normal" is not the exact opposite of "subnormal" because of the other possible non-subnormal values.
Infinite —
math.is_infiniteThe FLOAT type may express IEEE 754 infinities. These are signed values. Infinities behave with special semantics for some operators.There is no literal syntax for assigning infinities, but
math.POS_INFINITYandmath.NEG_INFINITYconstants are provided.Zero There are two kinds of zero: positive and negative. Both compare equal.
No VCL function is provided to determine whether a floating point value is a zero. Because both positive and negative zero compare equal, a comparison may be made simply by
var.x == 0.
Conversions to STRING values are always rendered to 3dp (3 decimal places) precision:
declare local var.f FLOAT;set var.f = -3.5;log var.f; /* "-3.500" */