Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с приведением типов.  (Прочитано 19348 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« : 06-03-2010 13:09 » 

Написал, следующую функцию.
Код:
char *dectobin(unsigned long long a)
{
 const int resultSize = sizeof(a)*8+1;
    char *bin=new char[resultSize];
    unsigned long long bb;
    for(int i=0;i<resultSize-1;++i) bin[i]='0';
    bin[resultSize-1] = '\0';
    bb=a;
    int i=0;
    while(bb!=0)
    {
        if(static_cast<unsigned long long>(abs(bb)%2)!=0) bin[resultSize-2-i]='1';В этой строчке выдает ошибку.С2668
        ++i;
        bb=abs(bb)/2;
    }
    return 0;
}
В Гугле искал, ни чего толковлго не нашел А черт его знает... Помогите пожалуйста.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-03-2010 15:11 » 

Код:
if(bb%2)
{
   bin[resultSize-2-i]='1';
}

а если по-человечьи записать, выдаёт ошибку ? Улыбаюсь
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 06-03-2010 21:29 » 

Спасибо, в данной строке проблему решил, а как быть соследующей строкой: 
bb=unsigned __int64 abs(unsigned __int64(bb))/2; При компиляции выдает ошибку error C2062: type 'unsigned __int64' unexpected. abs не поддерживает тип 'unsigned __int64' ? Возможно вопрос совершенно ламерский ......
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 06-03-2010 21:46 » 

Янус, Не имеет смысла передавать в функцию abs переменные помеченные как unsigned. Также приводить значение к unsigned после этой функции. Вспомни математику, что обозначает абслолютное значение.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 06-03-2010 22:31 » 

Янус, Не имеет смысла передавать в функцию abs переменные помеченные как unsigned. Также приводить значение к unsigned после этой функции. Вспомни математику, что обозначает абслолютное значение.
А как сделать? В противном случае теряется точность.
Записан
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 06-03-2010 22:45 » 

Честно говоря я вообще потерялся.... У меня в программе есть две функции которым надо работать с большими числами(порядка 20 цифр). Одна функция переводит подобное число в двоичное(приведена выше), а другая из шестнадцатиричного в десятичное.
Код:
unsigned long long HEX_TO_DEC(char st[17])
{
        int i,k,p;
     unsigned long long  s;
        s=0;
        p=strlen(st)-1;
        for (i=0; st[i]!='\0'; i++)
        {
                switch (toupper(st[i]))
                {
                case 'A': k=10; break;
                case 'B': k=11; break;
                case 'C': k=12; break;
                case 'D': k=13; break;
                case 'E': k=14; break;
                case 'F': k=15; break;
                case '1': k=1; break;
                case '2': k=2; break;
                case '3': k=3; break;
                case '4': k=4; break;
                case '5': k=5; break;
                case '6': k=6; break;
                case '7': k=7; break;
                case '8': k=8; break;
                case '9': k=9; break;
                case '0': k=0; break;
                }
                s=s+k * pow(double(16),int(p));Здесь насколько я понял pow которая выдает результат в формате double
                                                                   преобразуется в  unsigned __int64 и цифры теряются Как этого избежать ?
                p--;
        }
       
 return s;
}
В процессе преобразования теряется точнось (функции просто обрезают последние цифры) Не pow не abs не получается заставить работаь с типом  unsigned __int64. Или я чего-то не понимаю ?

   
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 07-03-2010 06:32 » 

Янус, бесзнаковое 64-битное целое дает лишь 19 полноценных десятичных знаков, а при использовании знака - 18.

Для больших чисел используются специальные библиотеки для арифметики с большими (и очень большими) числами. Например, GMP.
GMP
GMP Install Instruction for Windows Platform
Поиск
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 07-03-2010 09:59 » 

с большими числами(порядка 20 цифр).
а я не понял, что требуется - точность 20 знаков или просто 20-я степень десятки ? Улыбаюсь Если второе, то достаточно использовать тип double

а вот это
Код:
                s=s+k * pow(double(16),int(p));Здесь насколько я понял pow которая выдает результат в формате double
                                                                   преобразуется в  unsigned __int64 и цифры теряются Как этого избежать ?


лучше записать так
Код:
                s|=(k<<4);
« Последнее редактирование: 07-03-2010 10:02 от Алексей1153++ » Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 07-03-2010 11:44 » 

Нет именно точность 20 знаков т.е число целое положительное двадцатизначное.
кто-нибудь работал с классом cBigNumber ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 07-03-2010 14:17 » 

Янус, интересно - где такая точность потребовалась ? Улыбаюсь
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 07-03-2010 20:19 » 

Вы будете смеятся, но это мой курсач по криптографии. Спасибо всем за помощь с большими числами благодаря Вашей помощи все стало более - менее понятно. Класс!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 07-03-2010 20:22 » 

Янус, а там умножение и деление используется ?
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 07-03-2010 20:25 » 

Умножение есть, а вот деления нету.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 07-03-2010 20:36 » 

покажи, какое там умножение
Записан

Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 07-03-2010 21:07 » 

В смысле ? В алгоритме или в классе больших чисел ?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 07-03-2010 21:18 » 

просто, может оказаться, что эти умножения кратны 2 - это тупо битовые сдвиги )
тогда можно свой шустрый класс сделать, в котором __int64 дополнится одним старшим байтом
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 10-03-2010 04:29 » 

Вы будете смеятся, но это мой курсач по криптографии. Спасибо всем за помощь с большими числами благодаря Вашей помощи все стало более - менее понятно. Класс!

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

твою функцию преобразования можно спокойно заменить на strtoi64
« Последнее редактирование: 10-03-2010 04:37 от LogRus » Записан

Странно всё это....
Янус
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 12-03-2010 10:00 » 

Вы будете смеятся, но это мой курсач по криптографии. Спасибо всем за помощь с большими числами благодаря Вашей помощи все стало более - менее понятно. Класс!

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

твою функцию преобразования можно спокойно заменить на strtoi64

Спасибо всем кто откликнулся. Это новый алгоритм хеширования.  А библиотека мне понабилась из-за моего плохого знания программирования. Суть в следующем в документации к алгоритму дана матрица преобразования, которая записана в 16 виде(для сокращения записи), числа вида 8e20faa72ba0b470. Ее следует преобразовать в бинарный вид, и затем перемножить на сформированный до этого вектор.  Так как писать прогу для преобразования из 16 в 2 было некогда, я банально перебросил из 16 в 10(вот тут то и понабилась библиотека), а из 10 в 2. И выполнил умножение. Понимаю, что это в корне не верно, но на тот момент это казалось наиболее приемлемым решением..... Прошу больно не пинать за лузерство.....
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 12-03-2010 13:27 » 

Янус, преобразовать из строкового шестнадцатеричного представления в целое очень просто:

Код: (C)
char hex[8] = 'a1b2c3d4';
unsigned long bin = 0;
int i;

for (i = 0; i < 8; i++)
  bin = (bin << 4) | (hex[i] <= '9' ? hex[i] - 0x30 : (hex[i] & 0xdf) - 0x37);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #19 : 13-03-2010 09:50 » 

бугага, тут (в параллельной ветке) пушистый меня убедил, что свитч рулит)))
Записан

С уважением Lapulya
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #20 : 15-03-2010 05:06 » 

lapulya, ну рулит там не столько  свич, но и отсутствие вот таких штук
Код:
hex[i] - 0x30
во вторых, если не проблемы с производительностью (доказано, что программа тормозит из-за конкретного кода), то есть стандартные средства.

вернёмся к проблеме
..........Это новый алгоритм хеширования.  ............... Суть в следующем в документации к алгоритму дана матрица преобразования, которая записана в 16 виде(для сокращения записи), числа вида 8e20faa72ba0b470. Ее следует преобразовать в бинарный вид, и затем перемножить на сформированный до этого вектор.  ................
что за новый алгоритм? где достать документацию? Меня не покидает ощущение, того, что тут есть какая-то хитрая-хитрость.
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines