перевод из битовой карты во float ;-(

Discussion in 'Off Topic' started by ranger, Mar 24, 2005.

  1. ranger

    ranger Well-Known Member

    Joined:
    Feb 15, 2000
    Messages:
    841
    Location:
    spb
    перевод из битовой карты во float ;-(

    Привет всем! Нужна помощь ? пишу диплом. Нужно написать код, который бы переводил битовые карты во float число по всем правилам его формирования.

    1 01111110 11000000000000000000000 = -0,875
    зн характеристика мантисса

    вопрос как это сделать. Мучаюсь уже вторую неделю? наверное уже вошел в клинч.. или получается ерунда на выходе или еще что?также не могу проверить правильно ли у меня получается? Перелопатил кучу литературы? блин, спасайте!

    Битовые карты строю ? перевести их в float число не могу ;-(
     
  2. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
  3. hardy

    hardy Well-Known Member

    Joined:
    Sep 25, 2002
    Messages:
    16,608
    Location:
    Saratov, Russia
    Re: перевод из битовой карты во float ;-(

    ну не программер он, не программер :D:D
     
  4. ranger

    ranger Well-Known Member

    Joined:
    Feb 15, 2000
    Messages:
    841
    Location:
    spb
    Re: перевод из битовой карты во float ;-(

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

    может есть гений который сможет код кинуть?

    void IntToBin(int i, int N, char *str)
    {
    int k; double dec,v;
    strcpy(str,"");
    dec=i;
    v=pow(2,N-1);

    for(k=1;k<=N;k++)
    {if(dec>=v)
    {strcat(str,"1");
    dec-=v;
    }
    else strcat(str,"0");
    v=v/2;
    }

    }

    int d=pow(2,m);
    i=1;
    for(i=N/2;i<N;i++)
    {for(j=0;j<M;j++)
    {dig=i*(pow(2,(j-d)));

    IntToBin(i,n,str1);
    IntToBin(j,m,str2);
    strcpy(str,str1);
    strcat(str," ");
    strcat(str,str2);
    strcat(str," ");
    strcat(str,FloatToStr(dig).c_str());
    fprintf(fp," %s \n",str);
    //Memo1->Lines->Add(dig);
    }
    // Memo1->Lines->Add("\n");
    }


    числа получаются, но они совсем странные, на float не похожие ;-) и потом если смещение неправильно посчитать ерудна получается, а я не увререн что считаю его правильно... и проверить как непонятно ;-(
     
  5. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
  6. --oleg

    --oleg Well-Known Member

    Joined:
    Dec 20, 2001
    Messages:
    4,414
    Location:
    Russia
    Re: перевод из битовой карты во float ;-(

    Проверить элементарно - берешь указатель на переменную, в которой лежит полученное число, преобразовываешь его (указатель) в DWORD* , достаешь оттуда значение как DWORD, выводишь как битовую маску и сравниваешь с исходной.
     
  7. -exec-

    -exec- FH Consultant

    Joined:
    Jan 29, 2000
    Messages:
    24,690
    Location:
    xUSSR
    Re: перевод из битовой карты во float ;-(

    если не повезло, значит вещественные числа по разному нормализованы при равных значениях. ;)
     
  8. ranger

    ranger Well-Known Member

    Joined:
    Feb 15, 2000
    Messages:
    841
    Location:
    spb
    Re: перевод из битовой карты во float ;-(

    спасибо всем за участие, уже сделал. Кстати 23 бита комбинаций при размере матиссы 4 бита умещяются в файле размером 2мб ;-)

    проверять чесно говоря не хочется ;-)

    0000 0000 0,001953125
    0000 0001 0,0020751953125
    0000 0010 0,002197265625
    0000 0011 0,0023193359375
    0000 0100 0,00244140625
    0000 0101 0,0025634765625
    0000 0110 0,002685546875
    0000 0111 0,0028076171875
    0000 1000 0,0029296875
    0000 1001 0,0030517578125
    0000 1010 0,003173828125
    0000 1011 0,0032958984375
    0000 1100 0,00341796875
    0000 1101 0,0035400390625
    0000 1110 0,003662109375
    0000 1111 0,0037841796875
    0001 0000 0,00390625
    0001 0001 0,004150390625
    0001 0010 0,00439453125
    0001 0011 0,004638671875
    0001 0100 0,0048828125
    0001 0101 0,005126953125
    0001 0110 0,00537109375
    0001 0111 0,005615234375
    0001 1000 0,005859375
    0001 1001 0,006103515625
    0001 1010 0,00634765625
    0001 1011 0,006591796875
    0001 1100 0,0068359375
    0001 1101 0,007080078125
    0001 1110 0,00732421875
    0001 1111 0,007568359375
    0010 0000 0,0078125
    0010 0001 0,00830078125
    0010 0010 0,0087890625
    0010 0011 0,00927734375
    0010 0100 0,009765625
    0010 0101 0,01025390625
    0010 0110 0,0107421875
    0010 0111 0,01123046875
    0010 1000 0,01171875
    0010 1001 0,01220703125
    0010 1010 0,0126953125
    0010 1011 0,01318359375
    0010 1100 0,013671875
    0010 1101 0,01416015625
    0010 1110 0,0146484375
    0010 1111 0,01513671875

    хотя словно хуйня получилась :)
     
  9. ranger

    ranger Well-Known Member

    Joined:
    Feb 15, 2000
    Messages:
    841
    Location:
    spb
    Re: перевод из битовой карты во float ;-(

    забыл сказать, знака нету (все положительные) запись мантиссы со скрытым битом
     
    1 person likes this.