1 import java.util.Arrays;
2 import java.text.DecimalFormat;
3 import java.text.DecimalFormatSymbols;
66 static private final char decimalPoint = DecimalFormatSymbols.getInstance().getDecimalSeparator();
69 static private final int WORD_LEN = Integer.SIZE;
98 public static void main(String[] args) {
101 if (args.length > 2) {
103 n = Integer.parseInt(args[0]);
104 f = Double.parseDouble(args[1]);
105 base = Integer.parseInt(args[2]);
106 }
catch (NumberFormatException e) {
107 System.err.println(
"Arguments: decimal integer, decimal float and base");
113 System.out.println ( String.format (
"Size of long = %d ", bc.
getLongSize()) );
114 System.out.println ( String.format (
"%d * %d = %d ", n, base, bc.
Product(n,base)) );
115 String ns = bc.
itoa ( n, base );
116 System.out.println ( String.format (
"%d in base 10 = %s in base %d", n, ns, base) );
117 System.out.println ( String.format (
"%s in base %d = %s in base 10", ns, base, bc.
atoi ( ns, base )) );
118 String nsf = bc.
ftoa ( f, base );
119 System.out.println ( String.format (
"%e in base 10 = %s in base %d", f, nsf, base) );
120 System.out.println ( String.format (
"%s in base %d = %s in base 10", nsf, base, bc.
atof ( nsf, base )) );
122 System.out.println ( String.format (
"%s in base %d = %s in IEEE754", nsf, base, nsIEEE754) );
123 System.out.println ( String.format (
"%s in IEEE754 = %s in base 10", nsIEEE754, bc.
IEEE754tof ( nsIEEE754 )) );
124 System.out.print ( String.format (
"%d = ", n) ); bc.
printBits ( n );
126 System.out.print ( String.format (
"(Negative numbers are represented in two's complement)\n") );
127 System.out.print ( String.format (
"~%d+1 = ", -n ) );
130 System.out.println ();
131 System.out.print ( String.format (
"Magnitude (%d) = %d\n", n, bc.
getMagnitude(n) ) );
132 System.out.println ( String.format (
"Number of bits of (%d) = ", n) + bc.
getNumberOfBits ( n ) );
135 System.out.print ( String.format (
" = %d\n", k ) );
136 System.out.print ( String.format (
"Magnitude (%d reversed) = %d\n", n, bc.
getMagnitude(k) ) );
137 System.out.println ( String.format (
"Number of bits of (%d reversed) = ", n) + bc.
getNumberOfBits ( k ) );
138 System.out.println ( String.format (
"Power: 2**-4 = %f", bc.
pow ( 2,-4 ) ) );
139 System.out.println ( String.format (
"Power: 2**3 = %f", bc.
pow ( 2,3 ) ) );
141 System.out.println ( String.format (
"modf: (%e,%e)",
modf(f)[0],
modf(f)[1]) );
142 System.out.println ( String.format (
"frac: (%e,%e)",
inte(f),
frac(f)) );
167 for (
int x = 32; x < 127; ++x ) {
168 System.out.print ( String.format (
"%03d = %c ", x, (
char) x ) );
169 if ( (x-31)%10 == 0 ) System.out.println ( );
171 System.out.println ( );
184 h = (h << 1) | (x & 1);
198 public static double pow(
long x,
long p) {
199 long pw =
ipow(x, Math.abs(p));
200 return p >= 0 ? pw : 1.0/pw;
210 public static long ipow(
long x,
long p) {
213 else if ( p%2 == 0 ) {
214 long pw =
ipow (x, p/2);
218 long pw =
ipow (x,(p-1)/2);
231 if (n == 0 || n == 1) {
232 System.out.print ( n );
238 System.out.print ( n & 1 );
299 public static String
itoa (
int num,
int base ) {
301 if ( num == 0 )
return "0";
302 if ( base < 2 || base > 36 )
return str;
304 int n = Math.abs(num);
309 if ( base > 10 && nb > 9 )
310 str = (char)(nb-10 +
'a') + str;
316 if ( num < 0 ) str =
'-' + str;
329 public static String
fftoa (
double num,
int base ) {
331 if ( num == 0 )
return "0";
332 if ( base < 2 || base > 36 )
return str;
334 double n = Math.abs(num);
337 int nb = (int)
modf(n%base)[0];
338 if ( base > 10 && nb > 9 )
339 str = (char)(nb-10 +
'a') + str;
341 str = (char)(nb+
'0') + str;
345 if ( num < 0 ) str =
'-' + str;
357 for ( i = str.length()-1; i >= 0; i-- ) {
358 if (str.charAt(i) !=
'0' || str.charAt(i) ==
decimalPoint)
362 return str.substring(0,i+1);
374 StringBuilder str2 =
new StringBuilder();
377 str2.append (str,1,point);
378 str2.append (str,point+1,str.length());
381 str2.append (
itoa(point-1,10));
382 str = str2.toString();
385 for ( i = 0; i < str.length(); ++i ) {
386 if ( str.charAt(i) !=
'0' && str.charAt(i) !=
decimalPoint )
389 if ( i >= 2 && i < str.length() ) {
392 str2.append (str,i+1,str.length());
397 str2.append (
itoa(-i+1,10));
398 str = str2.toString();
416 public static String
ftoa (
double num,
int base ) {
418 if ( num == 0 )
return "0";
419 if ( base < 2 || base > 36 )
return str;
421 double n = Math.abs(num);
422 double nf =
modf(n)[1];
431 str += (char)((ni-10)+
'a');
433 str += (char)(ni+
'0');
450 public static String
zero (
int len) {
451 char[] repeat =
new char[len];
452 Arrays.fill(repeat,
'0');
453 return new String(repeat);
470 String str =
ftoa ( num, base );
472 String[] parts = str.split(
"E");
474 if ( parts.length > 1 ) {
475 expo =
atoi(parts[1],10);
480 if ( str.charAt(0) ==
'0' || (str.charAt(0) ==
'-' && str.charAt(1) ==
'0') )
482 if ( expoent.length() <
EXPO_LEN ) {
483 expoent =
zero(
EXPO_LEN).substring(expoent.length()) + expoent;
486 expoent = expoent.substring(0,
EXPO_LEN);
488 String mantissa = parts[0].substring(parts[0].indexOf(
decimalPoint)+1,parts[0].length());
489 String signal = (num < 0) ?
"1" :
"0";
490 if ( mantissa.length() <
FRAC_LEN ) {
491 mantissa +=
zero(
FRAC_LEN).substring(mantissa.length());
494 mantissa = mantissa.substring(0,
FRAC_LEN);
496 return signal+expoent+mantissa;
510 int signal = num.charAt(0) ==
'1' ? -1 : 1;
518 return signal * mantissa * Math.pow(2,expoent);
528 public static int atoi ( String num,
int base ) {
530 int len = num.length();
531 if ( base < 2 || base > 36 || len < 1 )
return n;
536 for (
int i = len-1; i>=0; i--){
538 if ( base > 10 && c >=
'a' && c <=
'a'+base-11 ) {
542 else if ( c >=
'0' && c <=
'0'+Math.min(base,10)-1 ) {
550 return num.charAt(0)==
'-'?-n:n;
560 public static double atof ( String num,
int base ) {
562 int len = num.length();
564 if ( base < 2 || base > 36 || len < 1 )
return n;
566 String[] parts = num.split(
"E");
570 int point = len - Math.max(pt,0) - 1;
571 if ( parts.length > 1 ) {
572 point -=
atoi(parts[1],10);
581 double p = Math.pow(base,-point);
584 for (
int i = len-1; i>=0; i--){
586 if ( base > 10 && c >=
'a' && c <=
'a'+base-11 ) {
590 else if ( c >=
'0' && c <=
'0'+Math.min(base,10)-1 ) {
598 return num.charAt(0)==
'-'?-n:n;
607 private static double frac(
double d) {
617 private static double inte(
double d) {
618 return d > 0 ? Math.floor(d) : Math.ceil(d);
629 private static double[]
modf(
double d) {
630 String num = Double.toString(d);
631 double[] arr =
new double[2];
632 String[] parts = num.split(
"E");
633 if ( parts.length > 1 ) {
634 int expo = Integer.valueOf ( parts[1] );
637 int len = parts[0].length();
639 String number = parts[0].substring(0,pt);
640 number += parts[0].substring(pt+1,Math.min(nc,len));
643 frac += parts[0].substring( nc, len );
647 number +=
zero(nc-len);
648 arr[0] = Double.parseDouble(number);
649 arr[1] = Double.parseDouble(
frac);
652 arr[1] = Double.parseDouble(num);
656 if ( parts.length > 1 ) {
658 if ( d < 0 ) parts[1] =
'-'+parts[1];
660 for (
int i = 0; i < parts.length; ++i )
661 arr[i] = Double.parseDouble(parts[i]);