def value_sgn(ins): """ SGN: get sign. """ inp = vartypes.pass_number_keep(parse_bracket(ins)) if inp[0] == '%': inp_int = vartypes.unpack_int(inp) return vartypes.pack_int(0 if inp_int==0 else (1 if inp_int > 0 else -1)) else: return vartypes.pack_int(fp.unpack(inp).sign() )
def value_sgn(ins): """ SGN: get sign. """ inp = vartypes.pass_number_keep(parse_bracket(ins)) if inp[0] == '%': inp_int = vartypes.unpack_int(inp) return vartypes.pack_int(0 if inp_int == 0 else ( 1 if inp_int > 0 else -1)) else: return vartypes.pack_int(fp.unpack(inp).sign())
def value_fix(ins): """ FIX: round towards zero. """ inp = vartypes.pass_number_keep(parse_bracket(ins)) if inp[0] == '%': return inp elif inp[0] == '!': # needs to be a float to avoid overflow return fp.pack(fp.Single.from_int(fp.unpack(inp).trunc_to_int())) elif inp[0] == '#': return fp.pack(fp.Double.from_int(fp.unpack(inp).trunc_to_int()))
def value_neg(ins): """ -: get negative value. """ return vartypes.number_neg(vartypes.pass_number_keep(parse_expr_unit(ins)))
def value_int(ins): """ INT: get floor value. """ inp = vartypes.pass_number_keep(parse_bracket(ins)) return inp if inp[0] == '%' else fp.pack(fp.unpack(inp).ifloor())
def value_abs(ins): """ ABS: get absolute value. """ return vartypes.number_abs(vartypes.pass_number_keep(parse_bracket(ins)))
def value_str(ins): """ STR$: string representation of a number. """ s = vartypes.pass_number_keep(parse_bracket(ins)) return representation.value_to_str_keep(s, screen=True)