Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Delphi
Перезагрузить страницу Вычисление числа ПИ как это сделать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
MSDDV MSDDV вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2005
По умолчанию Вычисление числа ПИ как это сделать - 09.12.2006, 11:37

Есть исходник на С нужно переделать его в Delphi. Надеюсь на ваше понимание.

Estimate.h
Код:
#include <math.h>
int estimate(int N,int X)
{
    double Answer=N/log10(X);
    Answer+=log(log(X))/log(X);
    Answer-=1;
    Answer/=2;
    return (int)Answer;
}
Float.h
Код:
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef unsigned long       DWORD;

#define MAXIMUM 157816 

WORD Array_Size=0; 
DWORD Number=0; 
double w_dig = 4.81647993; 


class Float
{
public:
    WORD    *Data; 
    Float()
    {
        Data=new WORD[Array_Size];
        if(Data==NULL)
        {
            printf("Ошибка:: не могу создать массив\n\tFile \"%s\"\tLine %d",__FILE__,__LINE__);
            exit(0);
        }
        int i;
        for(i=0;i<Array_Size;i++)
        {
            Data[i]=0;
        }
    }

    void Create
    {
        delete Data;
        Data=new WORD[Array_Size];
        if(Data==NULL)
        {
            printf("Ошибка:: не могу создать массив\n\tFile \"%s\"\tLine %d",__FILE__,__LINE__);
            exit(0);
        }
        int i;
        for(i=0;i<Array_Size;i++)
        {
            Data[i]=0;
        }
    }

    Float(WORD X)
    {
        Data=new WORD[Array_Size];
        if(Data==NULL)
        {
            printf("Ошибка:: не могу создать массив\n\tFile \"%s\"\tLine %d",__FILE__,__LINE__);
            exit(0);
        }
        int i;
        for(i=0;i<Array_Size;i++)
        {
            Data[i]=0;
        }
        Data[0]=X;
    }

    Float(Float& In)
    {
        Data=new WORD[Array_Size];
        if(Data==NULL)
        {
            printf("Ошибка:: не могу создать массив\n\tFile \"%s\"\tLine %d",__FILE__,__LINE__);
            exit(0);
        }
        int i;
        for(i=0;i<Array_Size;i++)
        {
            this->Data[i]=In.Data[i];
        }
    }

    ~Float()
    {
        delete Data;
    }

    void operator+=(Float &X)
    {
        int i;
        DWORD sum;

        for(i=Array_Size-1; i>0;i--)
        {
            sum=X.Data[i]+Data[i];
            Data[i] = (sum & (0xFFFF));
            Data[i-1] += (sum>>16);
        }
        Data[0]=Data[0]+X.Data[0];
    }

    void operator-=(Float &X) 
    {
        int i;
        long dif;

        for(i=Array_Size-1; i>0;i--)
        {
            dif=Data[i]-X.Data[i];
            if(dif<0)
            {
                dif+=0x10000;
                Data[i-1]--;
            }
            Data[i] = dif;
        }
        Data[0]-=X.Data[0];
    }

    void operator*=(WORD X) 
    {
        int i;
        DWORD mul=0;

        for(i=Array_Size-1; i>0; i--)
        {
            mul+=Data[i]*X;
            Data[i]=(mul & 0xFFFF);
            mul=mul>>16;
        }
        mul+=Data[0]*X;
        Data[0]=mul;
    }

    void operator=(WORD X) 
    {
        int i;
        for(i=0;i<Array_Size;i++)
        {
            Data[i]=0;
        }
        Data[0]=X;
    }

    void operator=(Float &X)    {
        int i;
        for(i=0;i<Array_Size;i++)
        {
            Data[i]=X.Data[i];
        }
    }

    void operator/=(WORD X
    {
        int i;
        DWORD div=0;

        for(i=0;i<Array_Size;i++)
        {
            div<<=16;
            div+=Data[i];
            Data[i]=div/X;
            div=div%X;
        }
    }

    void print(FILE* output=stdout)
    {
        int i;
        Float Temp;
        Temp=*this;

        fprintf(output,"%d,\n",Temp.Data[0]);
        Temp.Data[0]=0;
        for(i=1;i<=Number;i++)
        {
            Temp.Data[0]=0;
            Temp*=10;
            fprintf(output,"%d",Temp.Data[0]);
            if(i%5==0) putc(' ',output);
            if(i%50==0) putc('\n',output);
        }
    }

    bool isNull()
    {
        int i;
        for(i=0;i<Array_Size;i++)
        {
            if(Data[i]!=0) return false;
        }
        return true;
    }

    void printHex(FILE* output=stdout) 
    {
        int i,j,k;
        WORD Out;

        for(i=0; i<Array_Size; i++)
        {
            Out=Data[i];
            if(i%12==0) putc('\n',output);
            fprintf(output,"%.2X%.2X ",(Out>>8),( Out & (0xFF) ) );
        }
    }
};
math.h
Код:
void Arctan(WORD X,Float &out)
{
    int k;
    int Max=estimate(Number,X); 
    Float Temp;
    Float Si=1;
    Si/=X;

    for(k=0;;k++)
    {
        Temp=Si;
        Temp/=(WORD)(2*k+1);
        if(Temp.isNull()==true) break;

        if(k%2==0) out+=Temp;
        else out-=Temp;

        Si/=(WORD)(X*X);
        printf("\r%d%%",(k*100)/Max); 
    }
    printf("\rO.K.\n");
}

Float evalPi()
{
    Float A,Pi;
    printf("Этап: 1/5\n");
    Arctan(239,A);
    printf("Этап: 2/5\n");
    A*=4;
    printf("O.K.\nЭтап: 3/5\n");
    Arctan(5,Pi);
    printf("Этап: 4/5\n");
    Pi*=16;
    printf("O.K.\nЭтап: 5/5\n");
    Pi-=A;
    printf("O.K.\nВычисления завершились.\n");
    return Pi;
}
timer.h
Код:
#define TRUE 1
#define FALSE 0
#include <time.h>

clock_t TTimer;
long TTicks;
int isWorking=FALSE;

void startTimer()
{
    isWorking=TRUE;
    TTimer=clock();
}

long getTimer()
{
    if(isWorking==FALSE) return TTicks;
    else return clock()-TTimer;
}

long stopTimer()
{
    isWorking=FALSE;
    TTicks=clock()-TTimer;
    return TTicks;
}

double getTimerSec()
{
    double ret;

    if(isWorking==FALSE) ret=TTicks;
    else ret=clock()-TTicks;

    return ret/1000;
}
pi.cpp
Код:
#include <stdio.h>
#include <stdlib.h>
#include "estimate.h"
#include "Float.h"
#include "math.h"
#include "timer.h"

void main(int argc,char *argv[])
{
    FILE* output=stdout;

    if(argc==2)
    {
        Number=atoi(argv[1]);
        if(Number==0)
        {
            printf("Ошибка :: Неверный параметр №1\n\tЭто не число!");
            exit(0);
        }
        if(Number<=7)
        {
            printf("Ошибка :: Неверный параметр №1\n\tВы ввели слишком маленькое число (<8)");
            exit(0);
        }
    }
    else if(argc>=3)
    {
        Number=atoi(argv[1]);
        if(Number==0)
        {
            printf("Ошибка :: Неверный параметр №1\n\tЭто не число!");
            exit(0);
        }
        else if(Number<=7)
        {
            printf("Ошибка :: Неверный параметр №1\n\tВы ввели слишком маленькое число (<8)");
            exit(0);
        }
        else if(Number>MAXIMUM)
        {
            printf("Ошибка :: Неверный параметр №1\n\tВы ввели слишком большое число");
            exit(0);
        }

        output=fopen(argv[2],"w+");
        if(output == NULL)
        {
            printf("Ошибка :: не могу создать файл \"%s\". Возможно вы неправильно ввели имя файла",argv[2]);
            exit(1);
        }
    }
    fprintf(output," Вас приветствует программа по вычислению числа Пи\n");
    fprintf(output,"======================================================================\n");
    if(argc==1)
    {
        printf("Сколько знаков после запятой в числе Пи вы хотите получить (7-%ld):\n",MAXIMUM);
        scanf("%ld",&Number);
        if(Number>MAXIMUM)
Ответить с цитированием
  (#2 (permalink)) Старый
Зирк Зирк вне форума
Member
 
Сообщений: 1,337
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 14.04.2005
По умолчанию 09.12.2006, 19:42

Мы поняли. Что дальше-то?
Может Вам сюда?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны действительные числа a1,...,a20. Получить числа b1,...,b20, ... Ptitsa Pascal 1 22.12.2011 01:29
вычисление значения функции и переменных, вычисление площади треугольника, определени _Alex_ Delphi 0 18.12.2011 19:45
Вычисление выражения A*(A-N)*(A-2*N)*…* (A-N**2) ew6is Lisp 9 10.11.2010 14:40
вычисление числа четных элементов ygolek Prolog 3 18.05.2010 22:20
Вычисление степени числа рекурсивным вызовом Gock C++ Builder 2 24.03.2010 21:10
вычисление бинома Victorija 2707 Pascal 0 18.01.2010 19:21
Вычисление числа четных элементов d-rush Prolog 1 31.03.2009 18:04
Вычисление выражения wish_to_know Prolog 4 02.06.2008 23:55
Вычисление min и max в массиве ReinWolf Вопросы начинающих программистов 16 05.10.2006 18:53
Случайные числа как сделать перестановку neo_den С/С++ 6 04.06.2006 14:07
Как ускорить вычисление vasya_uol Алгоритмы 1 14.12.2005 19:58
Как сделать вычисление arcsin Anonymous Алгоритмы 10 19.05.2003 13:53



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов