Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.09.01;
Скачать: CL | DM;

Вниз

Преобразование чисел   Найти похожие ветки 

 
bestolkov   (2011-07-20 18:15) [0]

Всем здравствуйте! Существует ли остроумный способ преобразования числа из формата с плавающей точкой в фиксированную точку без потери точности?


 
MBo ©   (2011-07-20 20:31) [1]

Приведите пример неостроумного преобразования, чтобы убедиться, что мы думаем об одних и тех же сущностях


 
Anatoly Podgoretsky ©   (2011-07-20 21:16) [2]

Без потери точности по определению нельзя


 
MBo ©   (2011-07-20 21:30) [3]

>Без потери точности по определению нельзя
Ну как же, всего (1 + 64 + 32768)=32833-битовое число понадобится для Extended ;)


 
Полвторого   (2011-07-21 02:40) [4]


> MBo ©   (20.07.11 21:30) [3]

хватит и меньше, если учесть что на большом удалении от нуля между отдельными числами с плавающей точкой возникают дырки кое-где и больше единицы.


 
MBo ©   (2011-07-21 07:03) [5]

>хватит и меньше,
Это уже будет некое перекодирование


 
bestolkov   (2011-07-21 07:55) [6]


> MBo ©   (20.07.11 20:31) [1]

function f2lx(Real_value: Double ; const scale: real; bits: integer): lfix;
var value : Double ;
begin
   value:= Real_value / scale * LX_Range;
   if (value < 0) then
    begin
       value := value-0.5;
        if (value < -LX_Range) then Result:= $80000000  else  Result :=Round(value) and LMask[bits];
    end
   else
    begin
       value :=value+ 0.5;
       if (value > LX_MAX) then Result:=$7FFFFFFF  else Result:= Round(value) and LMask[bits];
    end;
end;


 
MBo ©   (2011-07-21 10:06) [7]

Неуий маразм для чисел, по модулю меньших 32767, без учета денормализованных и т.п.
Для крупных чисел больше значащих цифр сохраняется

var
 d, d2: Double;
 i64, m64, ex: Int64;
 ifixed_s_15_16: Integer;
begin
 Randomize;
 d := (Random - 0.5) * exp(Random * 10);
 Memo1.Lines.Add(FloatToStr(d));
 i64 := PInt64(@d)^;
 m64 := i64 and $000FFFFFFFC00000;
 m64 := m64 or $0010000000000000;
 ex := i64 shr 52;
 ex := ex and 2047;
 ex := ex - 1023;
 if ex < 0 then
   m64 := m64 shr (-ex)
 else
   m64 := m64 shl ex;
 m64:= m64 shr 36;
 ifixed_s_15_16 := m64;
 if i64 < 0 then
   ifixed_s_15_16 := - ifixed_s_15_16;
 d2 := ifixed_s_15_16 / 65536;
 Memo1.Lines.Add(FloatToStr(d2));


 
bestolkov   (2011-07-21 10:34) [8]

MBo ©   (21.07.11 10:06) [7]
Не совсем понял Вас, прокомментируйте ответ,пожалуйста


 
MBo ©   (2011-07-21 11:43) [9]

Из числа с плавающей точкой выделяется мантисса и экспонента, и формируется число с фиксированной точкой в формате знак - 15 бит целой части - 16 бит дробной siiiiiii.ffffff


 
bestolkov   (2011-07-21 12:23) [10]


> MBo ©   (21.07.11 11:43) [9]

Это ясно, а чем код лучше приведенного?


 
RWolf ©   (2011-07-21 13:10) [11]


> Существует ли остроумный способ преобразования числа из
> формата с плавающей точкой в фиксированную точку без потери
> точности?


есть такой способ.

inline int float2int( double d ) {
   union Cast { double d; long l; };
   volatile Cast c;
   cd = d + 6755399441055744.0;
   return cl;
}


 
Барт   (2011-07-21 13:31) [12]

> Это ясно, а чем код лучше приведенного?

Остроумнее


 
bestolkov   (2011-07-21 14:11) [13]

Ну, ключевое слово в вопросе - без потерь..


 
MBo ©   (2011-07-21 14:39) [14]

Вот как схематично выглядит расположение на положительной числовой оси чисел с фиксированной и с плавающей запятой:
http://mbo88.narod.ru/Image2.gif

Преобразование без потерь возможно на участках, где фикс. идут чаще.
Например, если числа с фикс. точкой с восемью двоичными цифрами после запятой, то однозначное преобразование возможно для Double > 2^44.
Если нужно для любых - безумный путь в [3]



Страницы: 1 вся ветка

Текущий архив: 2013.09.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1355837667
LDV
2012-12-18 17:34
2013.09.01
поиск дубликатов в таблице бд


15-1364233505
wl
2013-03-25 21:45
2013.09.01
Виброакустическая колонка и вред для винчестеров


15-1364579022
alexdn
2013-03-29 21:43
2013.09.01
Давненько о космосе не было


15-1364240820
Дмитрий С
2013-03-25 23:47
2013.09.01
Нет ли в дельфи каких-нибудь волшебных констант?


15-1364321098
TStas
2013-03-26 22:04
2013.09.01
Что такое искусственный интелект?