#!/usr/bin/perl use Getopt::Long; use integer; $helpusage = "placeholder"; GetOptions ('len=s' => \$len, 'num=s' => \$num, 'den=s' => \$den, 'skip' => \$skip) || die("$helpusage"); if (!defined($len)) { $len=8; } $LEN=$len; $n=d2b($num); # numerator - quotient $m=d2b($den); # denominator - divisor printf(".i 8\n"); printf(".o 4\n"); printf(".ilb q_ff[3] q_ff[2] q_ff[1] q_ff[0] m_ff[3] m_ff[2] m_ff[1] m_ff[0]\n"); printf(".ob smallnum[3] smallnum[2] smallnum[1] smallnum[0]\n"); printf(".type fr\n"); for ($q=0; $q<16; $q++) { for ($m=0; $m<16; $m++) { if ($m==0) { next; } $result=int($q/$m); printf("%s %s %s\n",d2bl($q,4),d2bl($m,4),d2bl($result,4)); } } exit; #$LEN=length($n); $a="0"x$LEN; $q=$n; #printf("n=%s, m=%s\n",$n,$m); #printf("a=%s, q=%s\n",$a,$q); for ($i=1; $i<=$LEN; $i++) { #printf("iteration $n:\n"); printf("$i: a=%s q=%s\n",$a,$q); $signa = substr($a,0,1); $a = substr($a.$q,1,$LEN); # new a with q shifted in if ($signa==0) { $a=b2d($a)-b2d($m); } else { $a=b2d($a)+b2d($m); } $a=d2b($a); $signa = substr($a,0,1); if ($signa==0) { $q=substr($q,1,$LEN-1)."1"; } else { $q=substr($q,1,$LEN-1)."0"; } } #printf("a=$a\n"); $signa = substr($a,0,1); if ($signa==1 && !defined($skip)) { printf("correction:\n"); $a=b2d($a)+b2d($m); $a=d2b($a); } #printf("a=$a\n"); printf("%d / %d = %d R %d ",b2d($n),b2d($m),b2d($q),b2d($a)); if ($a eq $n) { printf("-> remainder equal numerator\n"); } else { printf("\n"); } sub b2d { my ($v) = @_; $v = oct("0b" . $v); return($v); } sub d2b { my ($v) = @_; my $repeat; $v = sprintf "%b",$v; if (length($v)<$LEN) { $repeat=$LEN-length($v); $v="0"x$repeat.$v; } elsif (length($v)>$LEN) { $v=substr($v,length($v)-$LEN,$LEN); } return($v); } sub d2bl { my ($v,$LEN) = @_; my $repeat; $v = sprintf "%b",$v; if (length($v)<$LEN) { $repeat=$LEN-length($v); $v="0"x$repeat.$v; } elsif (length($v)>$LEN) { $v=substr($v,length($v)-$LEN,$LEN); } return($v); }