Iterate/Floating-point

From Esolang
Jump to navigation Jump to search

Back to Iterate

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>
>