|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
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) , и при каких Х погрешность стоит уменьшить(лучше показать погрешность). |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Арифметика высокой точности. Деление | 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 |