+sub floor ($) {
+ my ($v) = @_;
+ $v = new Math::BigRat $v; # we need a copy
+ return $v->bfloor();
+}
+
+sub sv ($) {
+ my ($in) = @_;
+ my $v = new Math::BigRat $in; # just in case
+ my $intpart = floor($v);
+ my $frac = $v - $intpart;
+ my $good = floor($frac * $F);
+ my $bad = $frac * $F - $good;
+ my $s = sprintf "%7d", $intpart;
+ if ($frac) {
+ $s .= sprintf ".%0${DIGS}d", $good;
+ $s .= sprintf "%-4s", ($bad ? "+$bad" : "");
+ } else {
+ $s .= sprintf " %${DIGS}s%4s", '', '';
+ }
+#print STDERR "# $in => $s # (intpart=$intpart frac=$frac)\n";
+ return $s;
+}
+