powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
8 сообщений из 8, страница 1 из 1
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38529045
IEEE 754
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для чисел одинарной точности (32 бит) по стандарту IEEE754 нашёл на просторах интернета довольно шуструю и простую функцию конвертации:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Type MyHex
 Lng As Long
End Type
Type MySingle
 sng As Single
End Type

Function Hex2Ieee754(b1, b2, b3, b4)
Dim h As MyHex
Dim s As MySingle
 h.Lng = Val("&H" & b1 & b2 & b3 & b4 & "&")
 LSet s = h
 Hex2Ieee754 = s.sng
End Function

Sub Test()
 Debug.Print Hex2Ieee754("40", "4A", "BB", "2D") 'Результат 3,167674
End Sub



А вот может кому известна подобная функция, которая позволяет конвертировать числа двойной точности (64 бит) по стандарту IEEE754 ???
&H419D6F34547E6B75 ->+123456789,12345679104328155517578125
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38529256
IEEE 754,

идея-то правильная и функция простая, но такое описание параметров (As Variant) и способ преобразования Val("&H" & b1 & b2 & b3 & b4 & "&") является очень неустойчивым к потенциальным ошибкам (из серии "как не надо делать").

А запрашиваемая функция делается по аналогии:
Код: vbnet
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.
Private Type T8Bytes
   b(0 To 7) As Byte
End Type

Private Type TDouble
   d As Double
End Type

Public Function Bytes2Double( _
   ByVal b0 As Byte, ByVal b1 As Byte, ByVal b2 As Byte, ByVal b3 As Byte, _
   ByVal b4 As Byte, ByVal b5 As Byte, ByVal b6 As Byte, ByVal b7 As Byte) As Double
 'Байты передаются от младшего к старшему, но можно сделать наоборот
 Dim x As T8Bytes
 Dim y As TDouble
 x.b(0) = b0
 x.b(1) = b1
 x.b(2) = b2
 x.b(3) = b3
 x.b(4) = b4
 x.b(5) = b5
 x.b(6) = b6
 x.b(7) = b7
 LSet y = x
 Bytes2Double = y.d
End Function

Вызов:
Код: vbnet
1.
2.
?Bytes2Double(&H75, &H6B, &H7E, &H54, &H34, &H6F, &H9D, &H41)
 123456789,123457

Есть ещё пара вариантов, основанных на вызове функций копирования области памяти, но незачем, LSet-а достаточно.
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38529291
IEEE 754
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot 13-й квартал]IEEE 754,

идея-то правильная и функция простая, но такое описание параметров (As Variant) и способ преобразования Val("&H" & b1 & b2 & b3 & b4 & "&") является очень неустойчивым к потенциальным ошибкам (из серии "как не надо делать").

Где там As Variant?
Подробнее про возможніе ошибки, пожалуйста.
В чём нестабильность?

так как надо решиться, свою функцию делать или взять за основу этот вариант, хотя его механизм до конца мне не ясен.
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38529430
IEEE 754Где там As Variant?Здесь:
Код: vbnet
1.
Function Hex2Ieee754(b1, b2, b3, b4)

При описании переменных и аргументов действует правило:HelpIf you don't specify a data type or object type, and there is no Deftype statement in the module, the variable is Variant by default.DefByte нет (не показан в листинге, по крайней мере). Соответственно, (с учётом других правил):
Код: vbnet
1.
Function Hex2Ieee754(b1, b2, b3, b4)

превращается в
Код: vbnet
1.
Public Function Hex2Ieee754(ByRef b1 As Variant, ByRef b2 As Variant, ByRef b3 As Variant, ByRef b4 As Variant) As Variant

.IEEE 754Подробнее про возможніе ошибки, пожалуйста.
В чём нестабильность? Таким образом, в функцию можно передать чёрта лысого, и она этого не заметит, потому что входные параметры не типизированы строго и их значения ничем не ограничены. Но это не всё.
Очень легко совершить ошибку типа такой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub Test()
 Dim b(0 To 3) As Byte
 Dim s As Single
 b(3) = CByte("&H40")
 b(2) = CByte("&H4A")
 b(1) = CByte("&HBB")
 b(0) = CByte("&H2D")
 s = Hex2Ieee754(Hex(b(3)), Hex(b(2)), Hex(b(1)), Hex(b(0)))
 Debug.Print s 'результат верный
 b(3) = CByte("&H40")
 b(2) = CByte("&H4A")
 b(1) = CByte("&H0B")
 b(0) = CByte("&H2D")
 s = Hex2Ieee754(Hex(b(3)), Hex(b(2)), Hex(b(1)), Hex(b(0)))
 Debug.Print s 'результат неверный
End Sub

Суслик виден?
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38529963
IEEE 754
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно, надо Function Hex2Ieee754(b1 AS String, b2 AS String, b3 AS String, b4 AS String) AS Single

В первом b(1) = CByte("&HBB")
Во втором b(1) = CByte("&H0B")
Так в чём ошибка, в контроле за входными данными?
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38530051
IEEE 754,

ошибки явной нет - есть ситуация, увеличивающая вероятность трудноотлавливаемых ошибок. Зачем в неё попадать, если можно правильно (As Byte) описать аргументы функции и не использовать потенциально непредсказуемый Val() вкупе с конкатенацией (кстати, если считать блох, то это медленные операции)?
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38530066
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IEEE 754в чём ошибка?Hex("&H0B")="B"
...
Рейтинг: 0 / 0
Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
    #38530070
IEEE 754
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й квартал,

Логично, тем более, что данные считываются из файла как Byte, но конкатенацию применить придётся, для проверки попадания значения в диапазон между &HFF800000 (- бесконечность) и &H7F800000 (+ бесконечность) иначе NAN (не число).
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Конвертация чисел двойной точности (64 бит) по стандарту IEEE754
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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