Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBS: 4 байта -> флоат / 4 сообщений из 4, страница 1 из 1
05.12.2006, 07:52
    #34176388
Kamsky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBS: 4 байта -> флоат
Имеется массив из 4 байт (считанные из устройства). Как перевести эти 4 байта в одну переменную формата float (32-бит IEEE 754)?
Задача осложняется тем, что используется VBS, а не VB...
...
Рейтинг: 0 / 0
05.12.2006, 15:52
    #34177978
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBS: 4 байта -> флоат
тривиально:

1ый (я с начала) бит - знак (1,0)
следующие 8 - экспонента, надо +127 еще прибавить
далее матиса про приципу:
пусть ai - итый ( с начала матисы, i от 1 бит)
m = 1 + a1/2 +a2/4 + a3/8 + a4/2^4...

итого : 2^(127 + exp)*m + знак,

а лучше преобразовать по указателю

вроде бы что-то такое

cInt()
или cFlt()

точно такое с cByte работало, т.е. преобразование из строки в массив байтов, попоробуйте, авось...

аффтопитезь
...
Рейтинг: 0 / 0
05.12.2006, 16:26
    #34178137
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBS: 4 байта -> флоат
Kamsky,
был бы это VB, можно было бы сделать простой LSet. А с VBS придётся действовать по описанию формата в стандарте:
Код: 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.
Function LongToFloat(X)
 Dim S, E, F

 S = -(X <  0 )
 E = (X And &H7F800000) \ &H800000
 F = X And &H7FFFFF
 
 If ( 0  < E) And (E <  255 ) Then
    LongToFloat = (- 1 ) ^ S *  2  ^ (E -  127 ) * ((F Or &H800000) / &H800000)
 ElseIf E =  0  Then
    If F =  0  Then
       If S =  0  Then
          LongToFloat =  0  'плюс ноль
       Else
          LongToFloat = - 0  'минус ноль
       End If
    Else '(E = 0) And (F <> 0)
       LongToFloat = (- 1 ) ^ S *  2  ^ (- 126 ) * (F / &H800000)
    End If
 Else 'E = 255
    If F =  0  Then
       If S =  0  Then
          LongToFloat =  0  'плюс бесконечность
       Else
          LongToFloat = - 0  'минус бесконечность
       End If
    Else '(E = 255) And (F <> 0)
       LongToFloat =  0  'не-число - NaN - Not a Number
    End If
 End If
End Function
Как представлять спецзначения, оптимизировать - придумывай сам.
Для "упаковки" четырёх байт в 32-разрядное слово:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function FourBytesToLong(B0, B1, B2, B3)
 If B3 <=  127  Then
    FourBytesToLong = B3 * &H1000000 + B2 * &H10000 + B1 * &H100& + B0
 Else
    FourBytesToLong = -(( 255  - B3) * &H1000000 + ( 255  - B2) * &H10000 + _
                        ( 255  - B1) * &H100& + ( 255  - B0) +  1 )
 End If
End Function
Для проверки:
Код: plaintext
1.
2.
3.
4.
Sub Test()
 Dim L
 L = LongToFloat(FourBytesToLong(&HDA, &H0F, &H49, &H40)) 'число Пи, по идее
End Sub
...
Рейтинг: 0 / 0
05.12.2006, 16:37
    #34178207
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBS: 4 байта -> флоат
Более правильно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Function FourBytesToLong(B0, B1, B2, B3)
 If B3 <=  127  Then
    FourBytesToLong = B3 * &H1000000 + B2 * &H10000 + B1 * &H100& + B0
 Else
    FourBytesToLong = -(( 255  - B3) * &H1000000 + ( 255  - B2) * &H10000 + _
                        ( 255  - B1) * &H100& + ( 255  - B0)) -  1 
 End If
End Function
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBS: 4 байта -> флоат / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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