Янус
|
|
« : 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; }
В Гугле искал, ни чего толковлго не нашел Помогите пожалуйста.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 06-03-2010 15:11 » |
|
if(bb%2) { bin[resultSize-2-i]='1'; }
а если по-человечьи записать, выдаёт ошибку ?
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #2 : 06-03-2010 21:29 » |
|
Спасибо, в данной строке проблему решил, а как быть соследующей строкой: bb=unsigned __int64 abs(unsigned __int64(bb))/2; При компиляции выдает ошибку error C2062: type 'unsigned __int64' unexpected. abs не поддерживает тип 'unsigned __int64' ? Возможно вопрос совершенно ламерский ......
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #3 : 06-03-2010 21:46 » |
|
Янус, Не имеет смысла передавать в функцию abs переменные помеченные как unsigned. Также приводить значение к unsigned после этой функции. Вспомни математику, что обозначает абслолютное значение.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Янус
|
|
« Ответ #4 : 06-03-2010 22:31 » |
|
Янус, Не имеет смысла передавать в функцию abs переменные помеченные как unsigned. Также приводить значение к unsigned после этой функции. Вспомни математику, что обозначает абслолютное значение.
А как сделать? В противном случае теряется точность.
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #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
|
|
« Ответ #6 : 07-03-2010 06:32 » |
|
Янус, бесзнаковое 64-битное целое дает лишь 19 полноценных десятичных знаков, а при использовании знака - 18. Для больших чисел используются специальные библиотеки для арифметики с большими (и очень большими) числами. Например, GMP. GMPGMP Install Instruction for Windows PlatformПоиск
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 07-03-2010 09:59 » |
|
с большими числами(порядка 20 цифр).
а я не понял, что требуется - точность 20 знаков или просто 20-я степень десятки ? Если второе, то достаточно использовать тип double а вот это s=s+k * pow(double(16),int(p));Здесь насколько я понял pow которая выдает результат в формате double преобразуется в unsigned __int64 и цифры теряются Как этого избежать ?
лучше записать так
|
|
« Последнее редактирование: 07-03-2010 10:02 от Алексей1153++ »
|
Записан
|
|
|
|
Янус
|
|
« Ответ #8 : 07-03-2010 11:44 » |
|
Нет именно точность 20 знаков т.е число целое положительное двадцатизначное. кто-нибудь работал с классом cBigNumber ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 07-03-2010 14:17 » |
|
Янус, интересно - где такая точность потребовалась ?
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #10 : 07-03-2010 20:19 » |
|
Вы будете смеятся, но это мой курсач по криптографии. Спасибо всем за помощь с большими числами благодаря Вашей помощи все стало более - менее понятно.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 07-03-2010 20:22 » |
|
Янус, а там умножение и деление используется ?
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #12 : 07-03-2010 20:25 » |
|
Умножение есть, а вот деления нету.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 07-03-2010 20:36 » |
|
покажи, какое там умножение
|
|
|
Записан
|
|
|
|
Янус
|
|
« Ответ #14 : 07-03-2010 21:07 » |
|
В смысле ? В алгоритме или в классе больших чисел ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #15 : 07-03-2010 21:18 » |
|
просто, может оказаться, что эти умножения кратны 2 - это тупо битовые сдвиги ) тогда можно свой шустрый класс сделать, в котором __int64 дополнится одним старшим байтом
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #16 : 10-03-2010 04:29 » |
|
Вы будете смеятся, но это мой курсач по криптографии. Спасибо всем за помощь с большими числами благодаря Вашей помощи все стало более - менее понятно. и что за алгоритм? у меня чувство, что где-то подвох и библиотека больших чисел нафиг не нужна и тем более double. насколько я помню в криптографии нужен чёткий результат, а double страдает потерей точности. твою функцию преобразования можно спокойно заменить на strtoi64
|
|
« Последнее редактирование: 10-03-2010 04:37 от LogRus »
|
Записан
|
Странно всё это....
|
|
|
Янус
|
|
« Ответ #17 : 12-03-2010 10:00 » |
|
Вы будете смеятся, но это мой курсач по криптографии. Спасибо всем за помощь с большими числами благодаря Вашей помощи все стало более - менее понятно. и что за алгоритм? у меня чувство, что где-то подвох и библиотека больших чисел нафиг не нужна и тем более double. насколько я помню в криптографии нужен чёткий результат, а double страдает потерей точности. твою функцию преобразования можно спокойно заменить на strtoi64 Спасибо всем кто откликнулся. Это новый алгоритм хеширования. А библиотека мне понабилась из-за моего плохого знания программирования. Суть в следующем в документации к алгоритму дана матрица преобразования, которая записана в 16 виде(для сокращения записи), числа вида 8e20faa72ba0b470. Ее следует преобразовать в бинарный вид, и затем перемножить на сформированный до этого вектор. Так как писать прогу для преобразования из 16 в 2 было некогда, я банально перебросил из 16 в 10(вот тут то и понабилась библиотека), а из 10 в 2. И выполнил умножение. Понимаю, что это в корне не верно, но на тот момент это казалось наиболее приемлемым решением..... Прошу больно не пинать за лузерство.....
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #18 : 12-03-2010 13:27 » |
|
Янус, преобразовать из строкового шестнадцатеричного представления в целое очень просто: 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
Молодой специалист
Offline
|
|
« Ответ #19 : 13-03-2010 09:50 » |
|
бугага, тут (в параллельной ветке) пушистый меня убедил, что свитч рулит)))
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Антон (LogRus)
|
|
« Ответ #20 : 15-03-2010 05:06 » |
|
lapulya, ну рулит там не столько свич, но и отсутствие вот таких штук во вторых, если не проблемы с производительностью (доказано, что программа тормозит из-за конкретного кода), то есть стандартные средства. вернёмся к проблеме ..........Это новый алгоритм хеширования. ............... Суть в следующем в документации к алгоритму дана матрица преобразования, которая записана в 16 виде(для сокращения записи), числа вида 8e20faa72ba0b470. Ее следует преобразовать в бинарный вид, и затем перемножить на сформированный до этого вектор. ................
что за новый алгоритм? где достать документацию? Меня не покидает ощущение, того, что тут есть какая-то хитрая-хитрость.
|
|
|
Записан
|
Странно всё это....
|
|
|
|