#!/usr/bin/perl

use POSIX;

$debug=0;

sub d2gier
{
  my $number=$_[0];
  my $d1;
  my $d2;
  my $d3;
  my $d4;
  if($number==0)
  {
    return (0,0,0,0);
  }
  my $sign=$number<0;
  my $anumber=abs($number);
  my $ln2 = floor(log($anumber)/log(2));
  for(my $expo = $ln2-1; $expo<=($ln2+1); $expo++)
  {
    my $man1 = floor($anumber*2.0**(28-$expo));
    my $man2 = floor($anumber*2.0**(28-$expo)+0.5);
    print "round\n" if(($man1!=$man2)&&($debug>0));
    my $man=$man2;
    $man = 2**30-$man if($sign);
    $d4 = ($man    )&1023;
    $d3 = ($man>>10)&1023;
    $d2 = ($man>>20)&1023;
    $d1 = $expo;
    $d1 = $d1+1024 if($d1<0);
    print "  number: $number expo: $expo man: $man $d1 $d2 $d3 $d4\n" if($debug>0);
    my $t1=$man>>30;
    my $t2=(($d2&512)==512)?1:0;
    my $t3=(($d2&256)==256)?1:0;
    print "  $t1 $t2 $t3\n" if($debug>0);
    last if(($man>>30)==0 && $t2 != $t3 && $t2 == $sign);
  }
  print "$number d2: " if($debug>0);
  for(my $i=9; $i>=0; $i--)
  {
    my $bit=(($d2>>$i)&1);
    print "$bit" if($debug>0);
  }
  print " $d1 $d2 $d3 $d4\n" if($debug>0);
  return ($d1,$d2,$d3,$d4);
}

sub slashprint
{
  my $d = $_[0];
  my @d4 = @$d;
  printf "%4d/%4d/%4d/%4d\n",$d4[0],$d4[1],$d4[2],$d4[3];
}

sub t1
{
  my $x = $_[0];
  my @g = d2gier($x);
  print "$x\t";
  slashprint(\@g);
}

for($p=-154; $p<=154; $p++)
{
  @g = d2gier(10**$p);
  print "   POWTAB[$p] := _r_e_a_l _1_0 ".$g[0]." _1_0 ".$g[1]." _1_0 ".$g[2]." _1_0 ".$g[3].";\n";
}





