![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Привет всем. Всегда переводил массив байт в тип Double, так были не большие числа. Но столкнулся с проблемой при переводе числа больше чем Double.
Вот пример: Код: Код:
var d8: array [0..7] of byte; D:Double; begin d8[0]:=StrToInt('$01'); d8[1]:=StrToInt('$02'); d8[2]:=StrToInt('$03'); d8[3]:=StrToInt('$04'); d8[4]:=StrToInt('$05'); d8[5]:=StrToInt('$06'); D:=Double(d8); end; А как быть если у меня массив байт не [0..7] а размером [0..15] |
#2
|
||||
|
||||
![]() Вообще-то такой перевод в дабл мягко говоря... не правильный. Дробные типы имеют не простое устройство, там есть степень и значимая часть, таким простым копированием будет бред. Разве что делфа сама догадается перевести массив в int64, а потом оттуда в дабл специальным образом.
Что представляют собой эти самые элементы массива? Если байтовые разряды, то считаем, что число записано в 256-ричной системе счисления, где 1 байт - 1 разряд. Код:
d := 0; for i := count - 1 downto 0 do d := d * 256 + arr[i]; ЗЫЖ 8 байт - это около 1.8*10^19. Если ты собираешься переводить 16 байт, значит число у тебя может быть примерно 3.24*10^38. Ты уверен, что тебе нужно переводить в дабл с дикой потерей точности? double способен вместить около 16 значащих цифр, остальное будет считаться как забитое нулями. То есть число 0x12345678876543215555555555555555 будет обрабатываться как 0x12345678876543210000000000000000. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 25.01.2013 в 16:26. |