All numbers, whether integers or otherwise, are IEEE754 double precision floating point numbers.
The implementation of jq
uses the C double
type.
This limits us to 53 bits of precision.
The usual operators are available to use with numbers:
arithmetic: +
, -
, *
, /
, %
comparison: ==
, !=
, <
, <=
, >=
, >
standard math functions
For one-input functions, pipe the value into the function
$ jq -n '(1 | atan) * 4'
3.141592653589793
For two-input functions, the functions will ignore input and expect the inputs as parameters
$ jq -n 'pow(2; 10)'
1024
Semi-colon is the separator for function arguments, not comma.
What does it mean to say "This limits us to 53 bits of precision"?
A demonstration:
$ jq -n 'pow(2;52) as $n | [$n, $n+1]'
[
4503599627370496,
4503599627370497
]
That looks good. What if we bump the exponent?
$ jq -n 'pow(2;53) as $n | [$n, $n+1]'
[
9007199254740992,
9007199254740992
]
Those numbers should not be equal.
This is what "loss of precision" looks like.
This means that jq
is not capable of handling arbitrarily large numbers.
jq
uses an if-then-else
expression for conditional expressions.
As an expression, it is placed in a pipeline.
Then syntax is: if CONDTITION then TRUE_EXPR else FALSE_EXPR end
.
The else
clause is optional in jq v1.7, but it is required in jq v1.6.
42 | if . < 33 then "small" else "larger" end
# => "larger"
Additional conditions use elif
42 | if . < 33 then "small"
elif . < 67 then "medium"
else "large"
end
# => "medium"