Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 20.06.2012, 13:33   #1 (permalink)
АлександрАвр
Новичок
 
Регистрация: 20.06.2012
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Достижение точности

Приветствую всех форумчан. Надо просто показать программно, достигается ли точьность n^(-23) на интервале Хпренадлежащем [0;1] ; если нет, то n^(-22) и тд. тип переменной делать не длинное (дабл), а сверх длинное(дубль дабл). Написать процедуру в мою программу.
Код программы на 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
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 11:13.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.