diff --git a/extensions/functions_rounding.yaml b/extensions/functions_rounding.yaml index 09309f2c2..32e082af1 100644 --- a/extensions/functions_rounding.yaml +++ b/extensions/functions_rounding.yaml @@ -14,6 +14,10 @@ scalar_functions: - value: fp64 name: "x" return: fp64 + - args: + - value: decimal + name: "x" + return: decimal - name: "floor" description: > @@ -27,6 +31,10 @@ scalar_functions: - value: fp64 name: "x" return: fp64 + - args: + - value: decimal + name: "x" + return: decimal - name: "round" description: > @@ -265,6 +273,137 @@ scalar_functions: - TIE_TO_ODD: round to nearest value; if exactly halfway, tie to the odd option. values: [ TIE_TO_EVEN, TIE_AWAY_FROM_ZERO, TRUNCATE, CEILING, FLOOR, - AWAY_FROM_ZERO, TIE_DOWN, TIE_UP, TIE_TOWARDS_ZERO, TIE_TO_ODD ] + AWAY_FROM_ZERO, TIE_DOWN, TIE_UP, TIE_TOWARDS_ZERO, TIE_TO_ODD ] + nullability: DECLARED_OUTPUT + return: fp64? + - args: + - value: fp64 + name: "x" + description: > + Numerical expression to be rounded. + - value: decimal<38,0> + name: "s" + description: > + Number of decimal places to be rounded to. + + When `s` is a positive number, the rounding + is performed to a `s` number of decimal places. + + When `s` is a negative number, the rounding is + performed to the left side of the decimal point + as specified by `s`. + options: + rounding: + description: > + When a boundary is computed to lie somewhere between two values, + and this value cannot be exactly represented, this specifies how + to round it. + + - TIE_TO_EVEN: round to nearest value; if exactly halfway, tie + to the even option. + - TIE_AWAY_FROM_ZERO: round to nearest value; if exactly + halfway, tie away from zero. + - TRUNCATE: always round toward zero. + - CEILING: always round toward positive infinity. + - FLOOR: always round toward negative infinity. + - AWAY_FROM_ZERO: round negative values with FLOOR rule, round positive values with CEILING rule + - TIE_DOWN: round ties with FLOOR rule + - TIE_UP: round ties with CEILING rule + - TIE_TOWARDS_ZERO: round ties with TRUNCATE rule + - TIE_TO_ODD: round to nearest value; if exactly halfway, tie + to the odd option. + values: [ TIE_TO_EVEN, TIE_AWAY_FROM_ZERO, TRUNCATE, CEILING, FLOOR, + AWAY_FROM_ZERO, TIE_DOWN, TIE_UP, TIE_TOWARDS_ZERO, TIE_TO_ODD ] nullability: DECLARED_OUTPUT return: fp64? + - args: + - value: decimal + name: "x" + description: > + Numerical expression to be rounded. + - value: decimal<38,0> + name: "s" + description: > + Number of decimal places to be rounded to. + + When `s` is a positive number, the rounding + is performed to a `s` number of decimal places. + + When `s` is a negative number, the rounding is + performed to the left side of the decimal point + as specified by `s`. + options: + rounding: + description: > + When a boundary is computed to lie somewhere between two values, + and this value cannot be exactly represented, this specifies how + to round it. + + - TIE_TO_EVEN: round to nearest value; if exactly halfway, tie + to the even option. + - TIE_AWAY_FROM_ZERO: round to nearest value; if exactly + halfway, tie away from zero. + - TRUNCATE: always round toward zero. + - CEILING: always round toward positive infinity. + - FLOOR: always round toward negative infinity. + - AWAY_FROM_ZERO: round negative values with FLOOR rule, round positive values with CEILING rule + - TIE_DOWN: round ties with FLOOR rule + - TIE_UP: round ties with CEILING rule + - TIE_TOWARDS_ZERO: round ties with TRUNCATE rule + - TIE_TO_ODD: round to nearest value; if exactly halfway, tie + to the odd option. + values: [ TIE_TO_EVEN, TIE_AWAY_FROM_ZERO, TRUNCATE, CEILING, FLOOR, + AWAY_FROM_ZERO, TIE_DOWN, TIE_UP, TIE_TOWARDS_ZERO, TIE_TO_ODD ] + nullability: DECLARED_OUTPUT + return: |- + decimal?<38,S1> + - + name: "fixed_round" + description: > + Rounding the value `x` to `s` decimal places. + impls: + - args: + - value: decimal + name: "x" + description: > + Numerical expression to be rounded. + - value: decimal<38,0> + constant: true + name: "s" + description: > + Number of decimal places to be rounded to. + + When `s` is a positive number, the rounding + is performed to a `s` number of decimal places. + + When `s` is a negative number, the rounding is + performed to the left side of the decimal point + as specified by `s`. + options: + rounding: + description: > + When a boundary is computed to lie somewhere between two values, + and this value cannot be exactly represented, this specifies how + to round it. + + - TIE_TO_EVEN: round to nearest value; if exactly halfway, tie + to the even option. + - TIE_AWAY_FROM_ZERO: round to nearest value; if exactly + halfway, tie away from zero. + - TRUNCATE: always round toward zero. + - CEILING: always round toward positive infinity. + - FLOOR: always round toward negative infinity. + - AWAY_FROM_ZERO: round negative values with FLOOR rule, round positive values with CEILING rule + - TIE_DOWN: round ties with FLOOR rule + - TIE_UP: round ties with CEILING rule + - TIE_TOWARDS_ZERO: round ties with TRUNCATE rule + - TIE_TO_ODD: round to nearest value; if exactly halfway, tie + to the odd option. + values: [ TIE_TO_EVEN, TIE_AWAY_FROM_ZERO, TRUNCATE, CEILING, FLOOR, + AWAY_FROM_ZERO, TIE_DOWN, TIE_UP, TIE_TOWARDS_ZERO, TIE_TO_ODD ] + nullability: DECLARED_OUTPUT + return: |- + S2 = (s > 0) ? min(s, S1) : 0 + P2 = (s > 0) ? ((S1 < s) ? (P1 + 1): P1) : ((P1 + s < S1) ? (S1 - s + 1) : (P1 + 1)) + P2 = min(38, P2); + decimal?