Iterate/Floating-point
Jump to navigation
Jump to search
This implements floating point algorithms into Iterate, following IEEE standard. For performance, the sign, exponent, and mantissa will be stored separately, which also allows the bit-length of the exponent and mantissa to vary.
Programs are uncompiled.
Parse string as float
((parse_float*))exponent_bits mantissa_bits<
*0< (sign*)<> >
*0< (mantissa*)<> >
*1< (mantissa_length*)<> >
*0< (integer*)<> >
*0< (fraction*)<> >
*1< (fraction_length*)<> >
*~?< (first*)<> >
(plus_(compare*))<=first><43>
(minus_(compare*))<=first><45>
(first_(is_number*))<=first><
*=first_out_result< (integer*)<> >
><
(plus_(if_else*))<=plus_equal><><
(minus_(if_else*))<=minus_equal><
*1< (sign*)<> >
>< !^ >
>
>
(parse_integer*)∞<
$parse_char
*~?< (parse_char*)<> >
(period_(compare*))<=parse_char><46>
(parse_null_(not*))<=parse_char>
(parse_char_(is_number*))<=parse_char><
(integer_(mul*))<=integer><10>
$integer *=integer_result< (integer*)<> >
*=parse_char_out_result< (integer*)<> >
><
(period_(if_else*))<=period_equal>< (do_fraction*)<> !parse_integer ><
(parse_null_(if_else*))<=parse_null_result>< !parse_integer >< !^ >
>
>
>
*=do_fraction<
(parse_fraction*)∞<
$parse_char
*~?< (parse_char*)<> >
(parse_null_(not*))<=parse_char>
(parse_char_(is_number*))<=parse_char><
(fraction_(mul*))<=fraction><10>
$fraction *=fraction_result< (fraction*)<> >
(fraction_length_(mul*))<=fraction_length><10>
$fraction_length *=fraction_length_result< (fraction_length*)<> >
*=parse_char_out_result< (fraction*)<> >
><
(parse_null_(if_else*))<=parse_null_result>< !parse_fraction >< !^ >
>
>
>
*1< (decrease_bias*)<> >
(build_mantissa*)∞<
(integer_(is_0_1_else*))<=integer>< !build_mantissa >< $decrease_bias !build_mantissa ><>
$decrease_bias
(shr_(div*))<=integer><2>
$integer *=shr_quotient< (integer*)<> >
*1< (mantissa_shifts*)<> >
*=shr_remainder< *=mantissa_length< (mantissa*)<> > >
(shr_(mul*))<=mantissa_length><2>
$mantissa_length *=shr_result< (mantissa_length*)<> >
>
*1< (top_exponent*)<> >
*?exponent_bits< *~n<
(top_exponent_(mul*))<=top_exponent><2>
$top_exponent *=top_exponent_result< (top_exponent*)<> >
> ! >
*=top_exponent< *~n< (exponent*)<> > ! >
*=mantissa_shifts< (exponent*)<> >
(pad_(sub*))<?mantissa_bits><=mantissa_shifts>
*=pad_result<
(pad_shl_(mul*))<=mantissa><2>
$mantissa *=pad_shl_result< (mantissa*)<> >
>
(extra_pad_(if_else*))<=decrease_bias>< (pad_result*)<> ><>
*=pad_result< (pad_remaining*)<> >
(build_mantissa_fraction*)∞<
(fraction_1_(is_0*))<=fraction>< !build_mantissa_fraction >
(fraction_(mul*))<=fraction><2>
$fraction *=fraction_result< (fraction*)<> >
(decrease_bias_1_(if_else*))<=decrease_bias><
(exponent_(sub*))<=exponent><1>
$exponent *=exponent_result< (exponent*)<> >
><>
(fraction_length_(compare*))<=fraction><=fraction_length>
(fraction_length_(or*))<=fraction_length_equal><=fraction_length_greater>
(fraction_length_(if_else*))<=fraction_length_result><
(fraction_(sub*))<=fraction><=fraction_length>
$fraction *=fraction_result< (fraction*)<> >
*1< (fraction_mantissa*)<> >
(decrease_bias_2_(if_else*))<=decrease_bias><
$decrease_bias
$fraction_mantissa
$fraction_mantissa_length
$pad_remaining *=pad_result< (pad_remaining*)<> >
>< (fraction_mantissa_length*)<>>
(fraction_2_(is_0*))<=fraction>< !build_mantissa_fraction >
>< (fraction_mantissa_length*)<> >
(pad_remaining_(is_0*))<=pad_remaining>< !build_mantissa_fraction >
(decrease_bias_3_(is_0*))<=decrease_bias><
(pad_remaining_(sub*))<=pad_remaining><1>
$pad_remaining *=pad_remaining_result< (pad_remaining*)<> >
>
(fraction_mantissa_(mul*))<=fraction_mantissa><2>
$fraction_mantissa *=fraction_mantissa_result< (fraction_mantissa*)<> >
>
(round_(div*))<=fraction_mantissa><2>
$fraction_mantissa *=round_quotient< (fraction_mantissa*)<> >
*=round_remainder< (fraction_mantissa*)<> >
*=pad_result< (pad_temp*)<> >
(pad_(sub*))<=pad_temp><=fraction_mantissa_length>
*=pad_result<
(fraction_mantissa_(mul*))<=fraction_mantissa><2>
$fraction_mantissa *=fraction_mantissa_result< (fraction_mantissa*)<> >
>
*=fraction_mantissa< (mantissa*)<> >
(mantissa_nil_(not*))<=mantissa>
(is_zero_total_(and*))<=decrease_bias><=mantissa_nil_result>
(is_zero_total_(if_else*))<=is_zero_total_result>< $exponent ><>
>
Addition/subtraction
((add_floats*))exponent_bits mantissa_bits
sign_a exponent_a mantissa_a
sign_b exponent_b mantissa_b<
*1< (sticky_length*)<> >
*=sign_a< (result_sign*)<> >
*=exponent_a< (result_exponent*)<> >
*=mantissa_a< (result_mantissa*)<> >
*=sign_b< (second_sign*)<> >
*=exponent_b< (second_exponent*)<> >
*=mantissa_b< (second_mantissa*)<> >
*2< (max_bit*)<> >
*?mantissa_bits<
(max_bit_(mul*))<=max_bit><2>
$max_bit *=max_bit_result< (max_bit*)<> >
>
(normalize_bit_(div*))<=max_bit><2>
*=normalize_bit_quotient< (result_mantissa*)<> (second_mantissa*)<> >
(ordered_(compare*))<=result_exponent><=second_exponent>
(ordered_less_(is_not_0*))<=ordered_less><
(align_(sub*))<=second_exponent><=result_exponent>
*=align_result<
(align_(div*))<=result_mantissa><2>
$result_mantissa *=align_quotient< (result_mantissa*)<> >
*=align_remainder< *=sticky_length< (sticky*)<> > >
(sticky_(mul*))<=sticky_length><2>
$sticky_length *=sticky_result< (sticky_length*)<> >
>
$result_exponent *=second_exponent< (result_exponent*)<> >
>
(ordered_greater_(is_not_0*))<=ordered_greater><
(align_(sub*))<=result_exponent><=second_exponent>
*=align_result<
(align_(div*))<=second_mantissa><2>
$second_mantissa *=align_quotient< (second_mantissa*)<> >
*=align_remainder< *=sticky_length< (sticky*)<> > >
(sticky_(mul*))<=sticky_length><2>
$sticky_length *=sticky_result< (sticky_length*)<> >
>
$second_exponent *=result_exponent< (second_exponent*)<> >
>
(add_(compare*))<=result_sign><=second_sign>
(add_(if_else*))<=add_equal><
*=second_mantissa< (result_mantissa*)<> >
><
(sub_(compare*))<=result_mantissa><=second_mantissa>
(sub_equal_(if_else*))<=sub_equal><
$result_sign
$result_exponent
$result_mantissa
><
(sub_greater_(if_else*))<=sub_greater><
(sub_(sub*))<=result_mantissa><=second_mantissa>
><
$result_sign *=second_sign< (result_sign*)<> >
(sub_(sub*))<=second_mantissa><=result_mantissa>
>
$result_mantissa *=sub_result< (result_mantissa*)<> >
>
>
(overflow_(compare*))<=result_mantissa><=max_bit>
(overflow_(or*))<=overflow_equal><=overflow_greater>
(overflow_(is_not_0*))<=overflow_result><
*1< (result_exponent*)<> >
(overflow_(div*))<=result_mantissa><2>
$result_mantissa *=overflow_quotient< (result_mantissa*)<> >
(sticky_(mul*))<=sticky><2>
$sticky *=sticky_result< (sticky*)<> >
*=overflow_remainder< (sticky*)<> >
(sticky_length_(mul*))<=sticky_length><2>
$sticky_length *=sticky_length_result< (sticky_length*)<> >
>
(sticky_guard_(div*))<=sticky><2>
$sticky *=sticky_guard_quotient< (sticky*)<> >
*=sticky_guard_remainder< (guard_bit*)<> >
(sticky_round_(div*))<=sticky><2>
$sticky *=sticky_round_quotient< (sticky*)<> >
*=sticky_round_remainder< (round_bit*)<> >
(guard_bit_(is_not_0*))<=guard_bit><
(sticky_(or*))<=round_bit><=sticky>
(sticky_(if_else*))<=sticky_result><
(mantissa*)<>
><
(round_up_(div*))<=result_mantissa><2>
(round_up_(is_not_0*))<=round_up_remainder><
(mantissa*)<>
>
>
>
(overflow_2_(compare*))<=result_mantissa><=max_bit>
(overflow_2_(or*))<=overflow_2_equal><=overflow_2_greater>
(overflow_2_(is_not_0*))<=overflow_2_result><
*1< (result_exponent*)<> >
(overflow_(div*))<=result_mantissa><2>
$result_mantissa *=overflow_quotient< (result_mantissa*)<> >
>
(normalize_(div*))<=result_mantissa><=normalize_bit_quotient>
$result_mantissa *=normalize_remainder< (result_mantissa*)<> >
(out_(print_num*))<=result_sign>
(out_(print_char*))<10>
(out_(print_num*))<=result_exponent>
(out_(print_char*))<10>
(out_(print_num*))<=result_mantissa>
>