| 
			| 
					
						| Янус | 
								|  | «  : 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. Ее следует преобразовать в бинарный вид, и затем перемножить на сформированный до этого вектор.  ................
 что за новый алгоритм? где достать документацию? Меня не покидает ощущение, того, что тут есть какая-то хитрая-хитрость. |  
						| 
								|  |  
								|  |  Записан | 
 
 Странно всё это.... |  |  | 
	|  |