вот такие проблемы. надо сделать лабу на с++ с высчитыванием простых чисел более 1 000 000 000. я сделал, но преподу не понравилось. вот теперь заново переделываю. Использую алгоритм динамического построения делителей до стартового порого(откуда начать считать); хотел для повышения скорости переписать одну функцию на асм. но столкнулся с рядом проблем. 1)Вначале не смог вставить асм код. Вернее код да я втавил, но линкер отказался линковать. Как я понял в обьекте(лаба по ООП), он не хочет вставлять мой асм код. Тогда я решил сделать по другому. Код (Text): void *p = &asm_func; p(); но так он не хочет вызывать. это была проблема 2. тогда я решил сделать в опкодах вызов call dword ptr [ebp-4] но так и не понял как это сделать в СИ. Как указать этому Билдеру, что это Опкоды! Вот и мои три проблемы... 1)Как вставить асм вставку в функции обьекта.asm{} - не получилось в обьекте. Так работает(в другой функции). 2)как сделать что то похожее на это: Код (Text): void *p = &asm_func; p(); - можно любым другим методом. 3)как написать что то в опкодах? 2 и 3 пункт нужны потому что первый не работает, и вот пытаюсь извратиться. Думаю может аргументы какой то АПИ передать не те, и что бы по выходу она мне asm_func вызвала...
Не, вызов асм кода через SEH преподу тоже может не понравится. Неужели там нету простых вставок _asm { } ?
есть, я же писал. но если есть асм вставка в функции/методе(тьфу! ну и придумали), который принадлежит обьекту то линкер материться. в visual c++ 6.0 всё нормально было.
Не, SEH тоже не подойдет, че то я не сразу въехал в суть. Создай поток, получи его конкекст и установи eip на адрес функции.
оформи асм код в отдельную процедуру PS: а линкер здесь каким боком? Очевидно на асм вставку может ругаться только компилятор
вот именно. Компилер отработал все хорошо, а линкер ругаеться на unresolved symbol+имя моей асм функции. но выход я уже нашел, обьявил функции, как дружественную, и вроде всё заработало. но вот скорости, всё равно не впечатляют...
dead_body вот такие проблемы. надо сделать лабу на с++ с высчитыванием простых чисел более 1 000 000 000. я сделал, но преподу не понравилось. Наверно препод на 386 запустил, поконтовался часик и решел, не катит Самый брутальный способ вычисления у меня на машине работал 111секунд, со стандартным fmodl из math.h, а пустой цикл прощел за 12 секунд(Селекон 2.6 MHz) Код (Text): #include "stdafx.h" #include <stdio.h> #include <math.h> #include <time.h> int main(int argc, char* argv[]) { long double i,f = 1000000000; time_t t = time(NULL); for(i=2; i<f; i++) { if(fmodl(f,i) == 0) { /* puts("false"); return(0); */ __asm { nop } } } printf("%d Sec.",time(NULL)-t); return 0; } Наверное нужен очень хитрый алгоритм. В математике не силен, но уже знаю что простые числа многих довели до ручки Вычилять ряд неимеверно затратно, легче просто делить до победного. Составлять таблицу, получается 1.8Гб(1000000000/4*8), может и сойдет если принести программу на DVD диске. Еще, наверное, можно составить таблицу контрольных точек, там например через куждую тысячу записывать одно простое число, потом находить ближайщее и по нему ваыичислять оставщийся ряд пока не встретишь заданное для вычисления значение(если не ощибся таблица получается 1.8Мб 1000000000/4/1000*8байт.Впринципе вполне терпимо и поиск быстро отработает и ряд продорлжать недлолго. А как делают ученые мужи?
Smile для __int64. Код (Text): if(h%deliteli[r] == 0); работает у меня вроде быстрее, чем: Код (Text): fmodl(h,deliteli[r]); как можно увеличить скорость кода в аттаче? я просто уже незнаю, но завтра сдавать, а скорости ~= 0. (для тех компов де это будет(1.4 проц,256 оперативы)) у меня та более менее нормально идёт. может работу с файлом добавить? сколько простых чисел до 100 000 000, хотя бы примерно?
Запакуй нормальным zip у меня 7z нету http://314159.ru/belov/prostie.htm Здесь есть программа, вычисляет болшее простое число по меньшему. Есть очень большая проблема, формула написана на VB, я было собрался перевести на С++, но руки не поднялись, после 3 строчки уже ругался матом. Нужно оттуда выжать формулу и сгенерировать талицу. сколько простых чисел до 100 000 000, хотя бы примерно? Если на глаз, то кждое третье-четвертое число простое 100000000/4 = 25000000 Но это для таблицы тоже много, поэтому записывать нужно только каждое 1000 число 100000000/4/1000 = 25000 Потом делать примерно так(N - число для тестирования) ищем в таблице самое первое число которое больше n, когда нашли берем из таблицы число которое меньше N(это будет L) проверяем все простые числа начиная с L, если среди них не окажется N, то число к простым не относится. Код (Text): bool FindPrimeDigit(__int64 L, __int64 N) { for(;;) { if(L == N) return(true); // згенерировать следующее простое число l = GetNextSimpleDigit(less); // Когда Л болше Н то искать уже бесполезно if(L > N) return(false); } } for(int i=0; i<max_table_size; i++) { if(n < table[i]) { // Вместо table[i-1] нужно искать в обратном направлении // это я схалтурил и решил что предидущее число меншье N FindPrimeDigit(table[i-1],n) } } Тема интересная, но сам я проверить не могу, автобус через 3 часа, еду отдыхать в деревню Ты уж не поленись испробуй и мой способ, расскажешь потом что получилось, удачи!
Вот и мои три проблемы... 1)Как вставить асм вставку в функции обьекта.asm{} - не получилось в обьекте. Так работает(в другой функции). 2)как сделать что то похожее на это: void *p = &asm_func; p(); - можно любым другим методом. 3)как написать что то в опкодах? Если ещё интересно смотри это: _899440844__DemoAsm.rar
dead_body может не хватало Код (Text): #ifdef __cplusplus extern "C" { #endif unsigned long __stdcall foo(unsigned char *, unsigned long); #ifdef __cplusplus } #endif Smile Стало быть и нормального WinRAR у тебя тоже нет, т.к. он 7z распаковывает, начиная кажется с 3.40 или чуть раньше
сколько простых чисел до 100 000 000, хотя бы примерно? Количество простых чисел, не превосходящих N асимптотически при больших N равно N/ln(N). Информации по простым числам - море как Инете, так и в библиотеке.