Iterate/Floating-point: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
reimplement |
No edit summary |
||
| Line 7: | Line 7: | ||
== Parse string as float == |
== Parse string as float == |
||
<pre> |
<pre> |
||
((*))boiler.it |
|||
(*)1< |
(*)1< |
||
// globals |
|||
*0< (sign*)<> > |
*0< (sign*)<> > |
||
*0< (mantissa*)<> > |
*0< (mantissa*)<> > |
||
| Line 16: | Line 17: | ||
*1< (fraction_length*)<> > |
*1< (fraction_length*)<> > |
||
// check the first character for the sign, or append it to the integer if it is a number |
|||
*~?< (first*)<> > |
*~?< (first*)<> > |
||
(plus_(compare*))<=first><43> |
(plus_(compare*))<=first><43> |
||
| Line 30: | Line 30: | ||
> |
> |
||
// parse any further number characters and add it to the integer |
|||
(parse_integer*)∞< |
(parse_integer*)∞< |
||
$parse_char |
$parse_char |
||
*~?< (parse_char*)<> > |
*~?< (parse_char*)<> > |
||
(period_(compare*))<=parse_char><46> |
(period_(compare*))<=parse_char><46> |
||
(parse_null_(not*))<=parse_char> |
(parse_null_(not*))<=parse_char> |
||
(parse_char_(is_number*))<=parse_char>< |
(parse_char_(is_number*))<=parse_char>< |
||
| Line 47: | Line 46: | ||
> |
> |
||
// if there was a decimal point, parse any further number characters and add it to the fraction |
|||
*=do_fraction< |
*=do_fraction< |
||
(parse_fraction*)∞< |
(parse_fraction*)∞< |
||
| Line 57: | Line 55: | ||
(fraction_(mul*))<=fraction><10> |
(fraction_(mul*))<=fraction><10> |
||
$fraction *=fraction_result< (fraction*)<> > |
$fraction *=fraction_result< (fraction*)<> > |
||
(fraction_length_(mul*))<=fraction_length><10> |
(fraction_length_(mul*))<=fraction_length><10> |
||
$fraction_length *=fraction_length_result< (fraction_length*)<> > |
$fraction_length *=fraction_length_result< (fraction_length*)<> > |
||
*=parse_char_out_result< (fraction*)<> > |
*=parse_char_out_result< (fraction*)<> > |
||
| Line 66: | Line 64: | ||
> |
> |
||
*1< (decrease_bias*)<> > |
*1< (decrease_bias*)<> > |
||
// build the mantissa from the integer |
|||
(build_mantissa*)∞< |
(build_mantissa*)∞< |
||
(integer_(is_0_1_else*))<=integer>< !build_mantissa >< $decrease_bias !build_mantissa ><> |
(integer_(is_0_1_else*))<=integer>< !build_mantissa >< $decrease_bias !build_mantissa ><> |
||
$decrease_bias |
$decrease_bias |
||
(shr_(div*))<=integer><2> |
(shr_(div*))<=integer><2> |
||
$integer *=shr_quotient< (integer*)<> > |
$integer *=shr_quotient< (integer*)<> > |
||
*1< (mantissa_shifts*)<> > |
*1< (mantissa_shifts*)<> > |
||
*=shr_remainder< *=mantissa_length< (mantissa*)<> > > |
*=shr_remainder< *=mantissa_length< (mantissa*)<> > > |
||
(shr_(mul*))<=mantissa_length><2> |
(shr_(mul*))<=mantissa_length><2> |
||
$mantissa_length *=shr_result< (mantissa_length*)<> > |
$mantissa_length *=shr_result< (mantissa_length*)<> > |
||
> |
> |
||
*127< (exponent*)<> > |
*127< (exponent*)<> > |
||
*=mantissa_shifts< (exponent*)<> > |
*=mantissa_shifts< (exponent*)<> > |
||
(pad_(sub*))<23><=mantissa_shifts> |
(pad_(sub*))<23><=mantissa_shifts> |
||
*=pad_result< |
*=pad_result< |
||
(pad_shl_(mul*))<=mantissa><2> |
(pad_shl_(mul*))<=mantissa><2> |
||
$mantissa *=pad_shl_result< (mantissa*)<> > |
$mantissa *=pad_shl_result< (mantissa*)<> > |
||
> |
> |
||
(extra_pad_(if_else*))<=decrease_bias>< (pad_result*)<> ><> |
|||
*=pad_result< (pad_remaining*)<> > // keep track of how many bits are left for the fraction |
|||
*=pad_result< (pad_remaining*)<> > |
|||
// build the fraction part of the mantissa (with one extra digit) |
|||
(build_mantissa_fraction*)∞< |
(build_mantissa_fraction*)∞< |
||
(fraction_1_(is_0*))<=fraction>< !build_mantissa_fraction > |
(fraction_1_(is_0*))<=fraction>< !build_mantissa_fraction > |
||
(fraction_(mul*))<=fraction><2> |
(fraction_(mul*))<=fraction><2> |
||
$fraction *=fraction_result< (fraction*)<> > |
$fraction *=fraction_result< (fraction*)<> > |
||
(decrease_bias_1_(if_else*))<=decrease_bias>< |
(decrease_bias_1_(if_else*))<=decrease_bias>< |
||
(exponent_(sub*))<=exponent><1> |
(exponent_(sub*))<=exponent><1> |
||
$exponent *=exponent_result< (exponent*)<> > |
$exponent *=exponent_result< (exponent*)<> > |
||
><> |
><> |
||
(fraction_length_(compare*))<=fraction><=fraction_length> |
(fraction_length_(compare*))<=fraction><=fraction_length> |
||
(fraction_length_(or*))<=fraction_length_equal><=fraction_length_greater> |
(fraction_length_(or*))<=fraction_length_equal><=fraction_length_greater> |
||
(fraction_length_(if_else*))<=fraction_length_result>< |
(fraction_length_(if_else*))<=fraction_length_result>< |
||
(fraction_(sub*))<=fraction><=fraction_length> |
(fraction_(sub*))<=fraction><=fraction_length> |
||
$fraction *=fraction_result< (fraction*)<> > |
$fraction *=fraction_result< (fraction*)<> > |
||
*1< (fraction_mantissa*)<> > |
*1< (fraction_mantissa*)<> > |
||
(decrease_bias_2_(if_else*))<=decrease_bias>< |
(decrease_bias_2_(if_else*))<=decrease_bias>< |
||
$decrease_bias |
$decrease_bias |
||
$fraction_mantissa |
$fraction_mantissa |
||
| Line 108: | Line 104: | ||
$pad_remaining *=pad_result< (pad_remaining*)<> > |
$pad_remaining *=pad_result< (pad_remaining*)<> > |
||
>< (fraction_mantissa_length*)<>> |
>< (fraction_mantissa_length*)<>> |
||
(fraction_2_(is_0*))<=fraction>< !build_mantissa_fraction > |
(fraction_2_(is_0*))<=fraction>< !build_mantissa_fraction > |
||
>< (fraction_mantissa_length*)<> > |
>< (fraction_mantissa_length*)<> > |
||
(pad_remaining_(is_0*))<=pad_remaining>< !build_mantissa_fraction > |
(pad_remaining_(is_0*))<=pad_remaining>< !build_mantissa_fraction > |
||
(decrease_bias_3_(is_0*))<=decrease_bias>< |
(decrease_bias_3_(is_0*))<=decrease_bias>< |
||
(pad_remaining_(sub*))<=pad_remaining><1> |
(pad_remaining_(sub*))<=pad_remaining><1> |
||
$pad_remaining *=pad_remaining_result< (pad_remaining*)<> > |
$pad_remaining *=pad_remaining_result< (pad_remaining*)<> > |
||
> |
> |
||
(fraction_mantissa_(mul*))<=fraction_mantissa><2> |
(fraction_mantissa_(mul*))<=fraction_mantissa><2> |
||
$fraction_mantissa *=fraction_mantissa_result< (fraction_mantissa*)<> > |
$fraction_mantissa *=fraction_mantissa_result< (fraction_mantissa*)<> > |
||
> |
> |
||
(round_(div*))<=fraction_mantissa><2> |
(round_(div*))<=fraction_mantissa><2> |
||
$fraction_mantissa *=round_quotient< (fraction_mantissa*)<> > |
$fraction_mantissa *=round_quotient< (fraction_mantissa*)<> > |
||
*=round_remainder< (fraction_mantissa*)<> > |
*=round_remainder< (fraction_mantissa*)<> > |
||
*=pad_result< (pad_temp*)<> > |
*=pad_result< (pad_temp*)<> > |
||
(pad_(sub*))<=pad_temp><=fraction_mantissa_length> |
(pad_(sub*))<=pad_temp><=fraction_mantissa_length> |
||
*=pad_result< |
*=pad_result< |
||
(fraction_mantissa_(mul*))<=fraction_mantissa><2> |
(fraction_mantissa_(mul*))<=fraction_mantissa><2> |
||
$fraction_mantissa *=fraction_mantissa_result< (fraction_mantissa*)<> > |
$fraction_mantissa *=fraction_mantissa_result< (fraction_mantissa*)<> > |
||
> |
> |
||
*=fraction_mantissa< (mantissa*)<> > |
*=fraction_mantissa< (mantissa*)<> > |
||
// set the exponent to 0 if the whole number was equal to zero |
|||
(mantissa_nil_(not*))<=mantissa> |
(mantissa_nil_(not*))<=mantissa> |
||
(is_zero_total_(and*))<=decrease_bias><=mantissa_nil_result> |
(is_zero_total_(and*))<=decrease_bias><=mantissa_nil_result> |
||
(is_zero_total_(if_else*))<=is_zero_total_result>< $exponent ><> |
(is_zero_total_(if_else*))<=is_zero_total_result>< $exponent ><> |
||
// print result |
|||
(sign_(print_num*))<=sign> |
(sign_(print_num*))<=sign> |
||
(nl_(print_char*))<10> |
(nl_(print_char*))<10> |
||
Revision as of 16:33, 18 November 2025
This implements floating point algorithms into Iterate, following IEEE standard. For performance, the sign, exponent, and mantissa will be stored separately.
Programs are uncompiled.
Parse string as float
((*))boiler.it
(*)1<
*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*)<> >
>
*127< (exponent*)<> >
*=mantissa_shifts< (exponent*)<> >
(pad_(sub*))<23><=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 ><>
(sign_(print_num*))<=sign>
(nl_(print_char*))<10>
(exponent_(print_num*))<=exponent>
(nl_(print_char*))<10>
(mantissa_(print_num*))<=mantissa>
>