Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Float(vb) to Real(Pascal) / 2 сообщений из 2, страница 1 из 1
10.11.2008, 07:02
    #35642955
Focus_NEW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Float(vb) to Real(Pascal)
Мозги уже закипели.
Пдскажите ка 8-и байтное с плавающей точкой преобразовать в 6-и байтное с плавающей точкой
Прочитал это
http://sources.ru/pascal/datatype/floatype.htm
и это
http://www.vbstreets.ru/VB/Articles/66295.aspx
сдела пока вот это (потом оптимизирую)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
Private Sub Command1_Click()
Dim i As Integer
Dim str As String
Dim Exponenta As Integer
Dim ee( 1  To  2 ) As Byte
Dim rr( 1  To  6 ) As Byte
Dim dd( 1  To  8 ) As Byte
Dim d As Double
d =  50 . 01 

 If d =  0  Then
    str = Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 ) & Chr( 0 )
Else
    CopyMemory dd( 1 ),  0 ,  8 
    CopyMemory rr( 1 ),  0 ,  6 
    
    CopyMemory dd( 1 ), d,  8 
    Debug.Print dd( 1 ) & " " & dd( 2 ) & " " & dd( 3 ) & " " & dd( 4 ) & " " & dd( 5 ) & " " & dd( 6 ) & " " & dd( 7 ) & " " & dd( 8 )
    
    ee( 1 ) = dd( 7 ) And  240 
    ee( 2 ) = dd( 8 ) And  127 
    
    MsgBox ee( 2 ) & " " & ee( 1 )
    Exponenta =  0 
    For i =  0  To  3 
            If (ee( 1 ) And  2  ^ (i +  4 )) >  0  Then Exponenta = Exponenta Or  2  ^ i
    Next i
    
    For i =  0  To  6 
            If (ee( 1 ) And  2  ^ i) >  0  Then Exponenta = Exponenta Or  2  ^ (i +  4 )
    Next i
    
    MsgBox Exponenta
    Exponenta = Exponenta -  1023  +  129 
    
    CopyMemory ee( 1 ), Exponenta,  2 
    rr( 1 ) = ee( 1 )
    MsgBox rr( 1 )
    rr( 6 ) = dd( 8 ) And  2  ^  7  ' çíàê
    
    If (dd( 7 ) And  2  ^  3 ) >  0  Then rr( 6 ) = rr( 6 ) Or  2  ^  6 
    If (dd( 7 ) And  2  ^  2 ) >  0  Then rr( 6 ) = rr( 6 ) Or  2  ^  5 
    If (dd( 7 ) And  2 ) >  0  Then rr( 6 ) = rr( 6 ) Or  2  ^  4 
    If (dd( 7 ) And  1 ) >  0  Then rr( 6 ) = rr( 6 ) Or  2  ^  3 
    If (dd( 6 ) And  2  ^  7 ) >  0  Then rr( 6 ) = rr( 6 ) Or  2  ^  2 
    If (dd( 6 ) And  2  ^  6 ) >  0  Then rr( 6 ) = rr( 6 ) Or  2 
    If (dd( 6 ) And  2  ^  5 ) >  0  Then rr( 6 ) = rr( 6 ) Or  1 
    
    If (dd( 6 ) And  2  ^  4 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2  ^  7 
    If (dd( 6 ) And  2  ^  3 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2  ^  6 
    If (dd( 6 ) And  2  ^  2 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2  ^  5 
    If (dd( 6 ) And  2 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2  ^  4 
    If (dd( 6 ) And  1 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2  ^  3 
    If (dd( 5 ) And  2  ^  7 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2  ^  2 
    If (dd( 5 ) And  2  ^  6 ) >  0  Then rr( 5 ) = rr( 5 ) Or  2 
    If (dd( 5 ) And  2  ^  5 ) >  0  Then rr( 5 ) = rr( 5 ) Or  1 
    
    If (dd( 5 ) And  2  ^  4 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2  ^  7 
    If (dd( 5 ) And  2  ^  3 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2  ^  6 
    If (dd( 5 ) And  2  ^  2 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2  ^  5 
    If (dd( 5 ) And  2 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2  ^  4 
    If (dd( 5 ) And  1 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2  ^  3 
    If (dd( 4 ) And  2  ^  7 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2  ^  2 
    If (dd( 4 ) And  2  ^  6 ) >  0  Then rr( 4 ) = rr( 4 ) Or  2 
    If (dd( 4 ) And  2  ^  5 ) >  0  Then rr( 4 ) = rr( 4 ) Or  1 
    
    If (dd( 4 ) And  2  ^  4 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2  ^  7 
    If (dd( 4 ) And  2  ^  3 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2  ^  6 
    If (dd( 4 ) And  2  ^  2 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2  ^  5 
    If (dd( 4 ) And  2 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2  ^  4 
    If (dd( 4 ) And  1 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2  ^  3 
    If (dd( 3 ) And  2  ^  7 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2  ^  2 
    If (dd( 3 ) And  2  ^  6 ) >  0  Then rr( 3 ) = rr( 3 ) Or  2 
    If (dd( 3 ) And  2  ^  5 ) >  0  Then rr( 3 ) = rr( 3 ) Or  1 
    
     If (dd( 3 ) And  2  ^  4 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2  ^  7 
    If (dd( 3 ) And  2  ^  3 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2  ^  6 
    If (dd( 3 ) And  2  ^  2 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2  ^  5 
    If (dd( 3 ) And  2 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2  ^  4 
    If (dd( 3 ) And  1 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2  ^  3 
    If (dd( 2 ) And  2  ^  7 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2  ^  2 
    If (dd( 2 ) And  2  ^  6 ) >  0  Then rr( 2 ) = rr( 2 ) Or  2 
    If (dd( 2 ) And  2  ^  5 ) >  0  Then rr( 2 ) = rr( 2 ) Or  1 
    
    str = Chr(rr( 1 )) & Chr(rr( 2 )) & Chr(rr( 3 )) & Chr(rr( 4 )) & Chr(rr( 5 )) & Chr(rr( 6 ))

End If

'
MsgBox RealToDouble(str)
End Sub

Public Function RealToDouble(ByVal Data As String) As Double
Dim dMantissa As Double
Dim i As Integer
Dim j As Long
Dim k As Long
Dim t As Integer

If Len(Data) <>  6  Then
'Err.Raise
'exception
Exit Function
End If

'accumulate the mantissa
dMantissa =  1 
For i =  6  To  2  Step - 1 
    If i =  6  Then
        t =  6 
    Else
        t =  7 
    End If
    For j = CLng(t) To  0  Step - 1 
        k = k +  1 
        If (Asc(Mid$(Data, i,  1 )) And CLng( 2  ^ j)) <>  0  Then
        dMantissa = dMantissa +  2  ^ -k
        End If
    Next j
Next i

'finally, assemble all the pieces into a number
If (Asc(Mid$(Data,  6 ,  1 )) And &H80) = &H80 Then
    RealToDouble = -dMantissa *  2  ^ (Asc(Mid$(Data,  1 ,  1 )) -  129 )
Else
    RealToDouble = dMantissa *  2  ^ (Asc(Mid$(Data,  1 ,  1 )) -  129 )
End If

'Thanks for your help
'David
End Function
realTodouble работает ка часы, гдето я это свиснул.
А вот обратно Command1_Click() работает если целая часть>10 иначе почемуто экспонента=2047, те максимально возможному, почему так ???
...
Рейтинг: 0 / 0
10.11.2008, 08:06
    #35642983
Focus_NEW
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Float(vb) to Real(Pascal)
бЛЯХА МУХА нашел ошибку
во втором цикле надо
не
Код: plaintext
1.
 If (ee( 1 ) And  2  ^ i) >  0  Then Exponenta = Exponenta Or  2  ^ (i +  4 )
а
Код: plaintext
1.
If (ee( 2 ) And  2  ^ i) >  0  Then Exponenta = Exponenta Or  2  ^ (i +  4 )
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Float(vb) to Real(Pascal) / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]