Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2012, 12:17   #1
АлександрАврел
Пользователь
 
Регистрация: 20.06.2012
Сообщений: 28
По умолчанию достяжение точности.

Приветствую всех форумчан. Надо просто показать программно, достигается ли точьность 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 ();

}
Спасибо.
АлександрАврел вне форума Ответить с цитированием
Старый 22.06.2012, 09:31   #2
АлександрАврел
Пользователь
 
Регистрация: 20.06.2012
Сообщений: 28
По умолчанию

мне надо показать программно, а не руками.
до кокого Х в степени от 1 до 200, погрешность составляет n(-23) ,
и при каких Х погрешность стоит уменьшить(лучше показать погрешность).
АлександрАврел вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметика высокой точности. Деление litviak Общие вопросы C/C++ 0 17.12.2011 23:48
Вопрос точности вычисления! Alexunder09 Visual C++ 0 15.02.2011 17:58
Delphi проблема в точности.... tanek Помощь студентам 2 25.10.2009 16:06
Не точности по проге Sasuke-sama Общие вопросы C/C++ 3 01.06.2009 19:51
Округление числа до заданной точности Siluet Общие вопросы Delphi 3 15.04.2009 17:39