source: trunk/CrypPlugins/PKCS1/Library/myFloat.cs @ 1893

Last change on this file since 1893 was 1778, checked in by schomburg, 11 years ago

renamed some classes for the sake of consistency

File size: 4.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Org.BouncyCastle.Math;
6
7namespace PKCS1.Library
8{
9    class MyFloat
10    {
11        static int prec = 1024;
12        BigInteger x;
13        int e;       
14
15        public MyFloat(MyFloat z)
16        {
17            x = z.x;
18            e = z.e;
19        }
20
21        public MyFloat()
22        {
23            x = BigInteger.ValueOf(0);
24            e = 0;
25        }
26
27       
28        public MyFloat(double d) //fehlerhaft
29        {
30            if (d != 0.0)
31            {
32                int l = Convert.ToInt32( Math.Log(d) / Math.Log(2.0) );
33                if (l < 64)
34                {
35                    x = to_ZZ((d * Math.Pow(2.0, 64.0 - (double)l)));
36                    e = l - 64;
37                }
38                else
39                {
40                    x = to_ZZ(d);
41                    e = 0;
42                }
43                e += 1024;
44            }
45            else
46            {
47                x = to_ZZ(0.0);
48                e = 0;
49            }
50            normalize();
51        }
52
53        public static void setPrec(int iPrec)
54        {
55            prec = iPrec;
56        }
57
58        public void normalize()
59        {
60            //int l = NumBits(x); // Bitlänge l von x, l(0) = 0
61            int l = x.BitLength;
62
63            if (l == 0)
64                e = 0;
65            else
66            {
67                int d = prec - l;
68
69                if (d > 0)
70                {
71                    //x <<= d;
72                    x = x.ShiftLeft(d);
73                    e -= d;
74                }
75                if (d < 0)
76                {
77                    //x >>= -d;
78                    x = x.ShiftRight(-d);
79                    e -= d;
80                }
81            }
82        }
83
84        public static BigInteger to_ZZ(ref MyFloat x)
85        {
86            BigInteger res = x.x;
87           
88            if (x.e <= prec)               
89                //res <<= prec + x.e;
90                res = res.ShiftRight(prec - x.e);
91            else
92                //res >>= prec - x.e;
93                res = res.ShiftLeft(prec - x.e);
94
95            return res;
96        }
97
98        private BigInteger to_ZZ(double x) //fehlerhaft
99        {
100            long bits = BitConverter.DoubleToInt64Bits(x);
101            int exponent = (int)((bits >> 52) & 0x7ffL);
102            long mantissa = bits & 0xfffffffffffffL;
103
104            BigInteger res = BigInteger.ValueOf(mantissa);
105            if (exponent >= 0)
106                res = res.ShiftLeft(prec + exponent);
107            else
108                res = res.ShiftRight(prec - exponent);
109
110            return res;
111        }
112
113        public static void to_Float(ref MyFloat res, ref BigInteger x)
114        {
115            res.x = x;
116            //res.e = 1024;
117            res.e = prec;
118            res.normalize();
119        }
120
121        public static void add(ref MyFloat res, ref MyFloat op1, ref MyFloat op2)
122        {
123            int d = op1.e - op2.e;
124            if (d >= 0)
125            {
126                res.x = op1.x.Add( (op2.x.ShiftRight(d) ) );
127                res.e = op1.e;
128            }
129            else
130            {
131                res.x = (op1.x.ShiftRight(-d) ).Add(op2.x);
132                res.e = op2.e;
133            }
134            res.normalize();
135        }
136
137        public void sub(ref MyFloat res, ref MyFloat op1, ref MyFloat op2)
138        {
139            int d = op1.e - op2.e;
140            if ( d >= 0 )
141            {
142                res.x = op1.x.Subtract( ( op2.x.ShiftRight( d ) ) );
143                res.e = op1.e;
144            }
145            else
146            {
147                res.x = (op1.x.ShiftRight( -d ) ).Subtract( op1.x );
148                res.e = op2.e;
149            }
150            res.normalize();
151        }
152
153        public static void mul(ref MyFloat res, ref MyFloat op1, ref MyFloat op2 )
154        {
155            res.x = op1.x.Multiply( op2.x );
156            res.e = op1.e + op2.e - prec;
157            res.normalize();
158        }
159
160        public static void div (ref MyFloat res, ref MyFloat op1, ref MyFloat op2 )
161        {
162            res.x = ( op1.x.ShiftLeft( prec ) ).Divide( op2.x );
163            res.e = op1.e - op2.e;
164            res.normalize();
165        }
166    }
167}
Note: See TracBrowser for help on using the repository browser.