20.06.2012, 13:33 | #1 (permalink) |
Новичок
Регистрация: 20.06.2012
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Достижение точности
Код программы на VS 2010 C++: #include <conio.h> #include <stdio.h> #include <math.h> #include "FIX.h" #include <Windows.h> #include <intrin.h> #pragma intrinsic(__rdtsc) #define f(x) (logf((1 + x) / (1 - x))) //Коэффициэнты f6 float f6koef[] = {0.420000f, 0.391429f, 0.200000f, 0.048387f, 0.009695f, 0.011065f, 0.001784f}; //Коэффициенты f6 для фикс точки FIX f6koefFx[] = {FLTOFIX(0.420000f), FLTOFIX(0.391429f), FLTOFIX(0.200000f), FLTOFIX(0.048387f), FLTOFIX(0.009695f), FLTOFIX(0.011065f), FLTOFIX(0.001784f)}; typedef float (*MPFLOAT)(float); //Степень ряда #define SOMEDEGREE 19 #define NITER ((SOMEDEGREE - 1) / 2) //Степень ряда с фиксированной точкой #define SOMEDEGREEFIX 19 #define NITERFIX ((SOMEDEGREEFIX - 1) / 2) //Погрешность float dres; //Количество точек для оценки времени const int countPoint = 10; //Количество циклов для оценки времени const int countCycle = 100000; //Количество функций для оценки const int countFunc = 7; //Количество функций с фиксированной точкой const int countFuncFix = 4; // Размер таблицы const int sizeTable = 2 << 12; // Кол-во младших разрядов у фиксированной точки const int YONGPOINTFIX = CPINT - 13; // ˜*Шаг таблица const float h = 1.0f / sizeTable; // Таблица float table[sizeTable][2]; FIX tableFix[sizeTable][2]; //Реализация с помощью стандартной библиотеки float etalon(float x) { float res = f(x); float powx = x; for(int i = 0; i < 7; i++) { res += f6koef[i] * powx; powx *= x; } return res; } //Пустая функция для измерения времени вызова float emptyFunc(float x) { return 1; } //Пустая функция для измерения времени с фикс точкой FIX emptyFunc(FIX x) { return 1; } //Измерение времени с фикс точкой FIX metrTimeFix(double timer[countFuncFix][countPoint + 1], __int64 timerT[countFuncFix][countPoint + 1]) { FIX ret = 0; PFIX pfix[] = {gornerCycleFix, gornerNoCycleFix, tableAlgoFix, emptyFunc}; FIX args[10]; int n = 0; for(float x = 0; x < 1; x += 0.1f) { args[n++] = FLTOFIX(x); } for(int n = 0; n < countFuncFix; n++) { PFIX p = pfix[n]; double total = 0; __int64 totalT = 0; for(int i = 0; i < countPoint; i++) { DWORD start = GetTickCount(); __int64 startT = __rdtsc(); for(int k = 0; k < countCycle; k++) { for(int a = 0; a < 10; a++) { ret = p(args[a]); } } __int64 endT = __rdtsc(); DWORD finish = GetTickCount(); timer[n][i] = (double)(finish - start) / 10 / countCycle; timerT[n][i] = (endT - startT) / 10 / countCycle; total += finish - start; totalT += endT - startT; } timer[n][countPoint] = total / countPoint / 10 / countCycle; timerT[n][countPoint] = totalT / countPoint / 10 / countCycle; } return ret; } //Вывод информации о времени вычесления функции void outMetrTime(char* descript[], int size, double timer[][countPoint + 1], __int64 timerT[][countPoint + 1]) { printf("Method\tTime\n"); for(int i = 0; i < size; i++) { printf("%s\t%I64d(%d nc)\n", descript[i], timerT[i][countPoint], (int)(timer[i][countPoint] * 1000000)); } printf("\n\n"); printf("n"); for(int i = 0; i < size; i++) printf("\t%s", descript[i]); printf("\n"); for(int i = 0; i < countPoint; i++) { printf("%d", i + 1); for(int n = 0; n < size; n++) printf("\t%I64d(%d nc)", timerT[n][countPoint], (int)(timer[n][countPoint] * 1000000)); printf("\n"); } } void main() { initTable(); char* descriptFix[] = {"Empty Func Fix"}; double timerFix[countFuncFix][countPoint + 1]; __int64 timerTFix[countFuncFix][countPoint + 1]; metrTimeFix(timerFix, timerTFix); printf("\n\nFIX\n"); outMetrTime(descriptFix, countFuncFix, timerFix, timerTFix); getch (); } Спасибо. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|