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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2012, 16:58   #1
Medved.tolik
 
Регистрация: 28.12.2010
Сообщений: 9
По умолчанию диапазон ассемблерной вставкой

Ребят) Вообщем нужна ваша помощь) Есть программа которая считает синус быстрей чем из стандартной библиотеки) но проблема с диапазоном) Сказали есть волшебная команда в ассемблере которая работает с входными данными в диапазоне от 10^-19 до 10^19 ) подскажите что за команда и как вставить её) вот сам код


Код:
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#define PI 3.14159265358
#define MAX_ANGLE (128*1024)

static double tableVal[MAX_ANGLE];
static double tableSin[MAX_ANGLE];
static double tableCos[MAX_ANGLE];

void initTables()
{
  int i;

  for( i = 0; i < MAX_ANGLE; i++)
  {
    tableVal[i] = (double) i / (double) MAX_ANGLE * PI;
    tableSin[i] = sin( tableVal[i] );
    tableCos[i] = cos( tableVal[i] );
  }
}

double mysin( double x )
{
  return tableSin[(int) (x / PI * (double) MAX_ANGLE)];
}

double mysin2( double x )
{
  register int i = (int) (x / PI * (double) MAX_ANGLE);
  return tableSin[i] + (x - tableVal[i]) * tableCos[i];
}

#define N 1000000
#define M 100

enum
{
  SINMIN = 0,
  SINMAX,
  SINAVE,
  SINLAST
};

#define INITIME(tm) \
    (tm)[SINMAX] = (tm)[SINMIN] = (tm)[SINAVE] = 0

#define GETTIME(f,tm) \
  do{ \
    double time1, time2; \
    double z, span; \
    int n; \
    \
    time1 = (double) clock(); \
    for( n=0,z=0; n<N; n++, z+=y) span = (f)(z); \
    time2 = (double) clock(); \
    \
    span = (time2 - time1) / CLOCKS_PER_SEC; \
    \
    if( (tm)[SINMAX] < span ) (tm)[SINMAX] = span; \
    if( (tm)[SINMIN] == 0 || (tm)[SINMIN] > span ) (tm)[SINMIN] = span; \
    (tm)[SINAVE] += span; \
  } while(0)

#define PRITIME(tm,fn) \
  printf( "%s time: %f %f %f ms\n", (fn), (tm)[SINMIN]*1000., (tm)[SINMAX]*1000., (tm)[SINAVE] / (double) M * 1000.);

#define SINCHECK

int main(void)
{
  int m;
  double y;
  double ts[SINLAST], ty[SINLAST], ty2[SINLAST];

  y = PI / (double) N;
  
  INITIME( ts );
  INITIME( ty );
  INITIME( ty2 );
  initTables();

#ifdef SINCHECK
  {
    int n; double z, e = 0., e2 = 0.;
    for( n=0,z=PI-y; n < N; n++, z-=y)
    {
      double m = mysin(z), m2 = mysin2(z), s = sin(z);
      if( fabs(s-m) > e ) e = fabs(s-m);
      if( fabs(s-m2) > e2 ) e2 = fabs(s-m2);
    }
    printf( "Max error: mysin=%g mysin2=%g\n", e, e2);
  }
#endif

  for( m = 0; m < M; m++)
  {
    GETTIME( mysin, ty);
    GETTIME( mysin2, ty2);
    GETTIME( sin, ts);
   
  }
  PRITIME( ts, "sin");
  PRITIME( ty, "mysin");
  PRITIME( ty2, "mysin2");
  getch();
  return 0;
}
Medved.tolik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивом в ассемблерной вставке Fabeldyr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 27.10.2011 15:01
Метка в ассемблерной вставке EugenK Общие вопросы C/C++ 12 12.09.2011 13:49
запись данных в массив + цикл ассемблерной вставкой ahz4et Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 16.01.2011 11:10
Задачка на ассемблере или любой распостраненный язык программирования с ассемблерной вставкой. Gremlin Помощь студентам 1 21.01.2009 21:22
Как написать в коде чтобы диапазон А копировался как значение в диапазон В. Dorvir Microsoft Office Excel 12 23.05.2008 22:11