Скачиваний:
17
Добавлен:
01.05.2014
Размер:
280.06 Кб
Скачать
  1. Tекст программы на языке Паскаль:

Программа 20. Вычисление функции ошибок распределения Гаусса (вар.1).

program erfd4;

{ evaluation of the gaussian error function }

var x,er,ec : real;

done : boolean;

function erf(x: real): real;

{ infinite series expansion of the Gaussian error function }

const sqrtpi = 1.7724538;

t2 = 0.66666667;

t3 = 0.66666667;

t4 = 0.07619048;

t5 = 0.01693122;

t6 = 3.078403E-3;

t7 = 4.736005E-4;

t8 = 6.314673E-5;

t9 = 7.429027E-6;

t10 = 7.820028E-7;

t11 = 7.447646E-8;

t12 = 6.476214E-9;

var x2,sum : real;

i : integer;

begin

x2:=x*x;

sum:=t5+x2*(t6+x2*(t7+x2*(t8+x2*(t9+x2*(t10+x2*(t11+x2*t12))))));

erf:=2.0*exp(-x2)/sqrtpi*(x*(1+x2*(t2+x2*(t3+x2*(t4+x2*sum)))))

end; { function erf }

function erfc(x: real): real;

{ complement of error function }

const sqrtpi = 1.7724538;

var x2,v,sum : real;

begin

x2:=x*x;

v:=1.0/(2.0*x2);

sum:=v/(1+8*v/(1+9*v/(1+10*v/(1+11*v/(1+12*v)))));

sum:=v/(1+3*v/(1+4*v/(1+5*v/(1+6*v/(1+7*sum)))));

erfc:=1.0/(exp(x2)*x*sqrtpi*(1+v/(1+2*sum)))

end; { function ercf }

begin { main }

ClrScr;

done:=false;

writeln;

repeat

write('Arg? ');

readln(x);

if x<0.0 then done:=true

else

begin

if x=0.0 then

begin

er:=0.0;

ec:=1.0

end

else

begin

if x<1.5 then

begin

er:=erf(x);

ec:=1.0-er

end

else

begin

ec:=erfc(x);

er:=1.0-ec

end { if }

end;

writeln('X= ',x:8:4,', Erf= ',er:12,', Erfc= ',ec:12)

end { if }

until done

end.

  1. Текст программы на языке С++:

#include<iostream.h>

#include<math.h>

#include<conio.h>

#include<stdio.h>

float x,er,ec;

int done;

float erf(float x)

{

const sqrtpi = 1.7724538,

t2 = 0.66666667,

t3 = 0.66666667,

t4 = 0.07619048,

t5 = 0.01693122,

t6 = 3.078403E-3,

t7 = 4.736005E-4,

t8 = 6.314673E-5,

t9 = 7.429027E-6,

t10 = 7.820028E-7,

t11 = 7.447646E-8,

t12 = 6.476214E-9;

float x2,sum;

int i;

x2 = x*x;

sum = t5+x2*(t6+x2*(t7+x2*(t8+x2*(t9+x2*(t10+x2*(t11+x2*t12))))));

return(2.0*exp(-x2)/sqrtpi*(x*(1+x2*(t2+x2*(t3+x2*(t4+x2*sum))))));

}

float erfc( float x )

{

const sqrtpi = 1.7724538;

float x2,v,sum ;

x2 = x*x;

v = 1.0/(2.0*x2);

sum = v/(1+8*v/(1+9*v/(1+10*v/(1+11*v/(1+12*v)))));

sum = v/(1+3*v/(1+4*v/(1+5*v/(1+6*v/(1+7*sum)))));

return(1.0/(exp(x2)*x*sqrtpi*(1+v/(1+2*sum))));

}

void main()

{

done=0;

printf("\n");

do

{

printf("Arg? ");

scanf("%f",&x);

if( x < 0.0 ) { done = 1; }

else

{

if (x==0.0 )

{

er=0.0;

ec=1.0;

}

else

{

if( x<1.5)

{

er=erf(x);

ec=1.0-er;

}

else

{

ec=erfc(x);

er=1.0-ec;

}

}

printf("X= %f",x ," Erf= %f",er,", Erfc= %f",ec);

}

} while (done == 0);

}

  1. Текст программы на языке Ассемблера:

@erf$qf proc far

push bp

mov bp,sp

sub sp,32

mov word ptr [bp-2],1

mov word ptr [bp-4],0

mov word ptr [bp-6],0

mov word ptr [bp-8],0

mov word ptr [bp-10],0

mov word ptr [bp-12],0

mov word ptr [bp-14],0

mov word ptr [bp-16],0

mov word ptr [bp-18],0

mov word ptr [bp-20],0

mov word ptr [bp-22],0

mov word ptr [bp-24],0

fld dword ptr [bp+6]

fmul dword ptr [bp+6]

fstp dword ptr [bp-28]

fld dword ptr [bp-28]

fldz

fmul

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fstp dword ptr [bp-32]

fld dword ptr [bp-28]

fchs

sub sp,8

fstp qword ptr [bp-40]

fwait

call far ptr _exp

add sp,8

fmul dword ptr DGROUP:s@

fld1

fdiv

fld dword ptr [bp-28]

fmul dword ptr [bp-32]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fldz

fadd

fmul dword ptr [bp-28]

fld1

fadd

fmul dword ptr [bp+6]

fmul

jmp short @1@58

@1@58:

mov sp,bp

pop bp

ret

@erf$qf endp

@erfc$qf proc far

push bp

mov bp,sp

sub sp,14

mov word ptr [bp-2],1

fld dword ptr [bp+6]

fmul dword ptr [bp+6]

fstp dword ptr [bp-6]

fld dword ptr [bp-6]

fmul dword ptr DGROUP:s@

fld1

fdivr

fstp dword ptr [bp-10]

fld dword ptr DGROUP:s@+4

fmul dword ptr [bp-10]

fld dword ptr DGROUP:s@+8

fmul dword ptr [bp-10]

fld1

fadd

fdiv

fld1

fadd

fld dword ptr DGROUP:s@+12

fmul dword ptr [bp-10]

fdivr

fld1

fadd

fld dword ptr DGROUP:s@+16

fmul dword ptr [bp-10]

fdivr

fld1

fadd

fld dword ptr DGROUP:s@+20

fmul dword ptr [bp-10]

fdivr

fld1

fadd

fdivr dword ptr [bp-10]

fstp dword ptr [bp-14]

fld dword ptr DGROUP:s@+24

fmul dword ptr [bp-10]

fld dword ptr DGROUP:s@+28

fmul dword ptr [bp-14]

fld1

fadd

fdiv

fld1

fadd

fld dword ptr DGROUP:s@+32

fmul dword ptr [bp-10]

fdivr

fld1

fadd

fld dword ptr DGROUP:s@+36

fmul dword ptr [bp-10]

fdivr

fld1

fadd

fld dword ptr DGROUP:s@+40

fmul dword ptr [bp-10]

fdivr

fld1

fadd

fdivr dword ptr [bp-10]

fstp dword ptr [bp-14]

fld dword ptr [bp-6]

sub sp,8

fstp qword ptr [bp-22]

fwait

call far ptr _exp

add sp,8

fmul dword ptr [bp+6]

fld1

fmul

fld dword ptr DGROUP:s@

fmul dword ptr [bp-14]

fld1

fadd

fdivr dword ptr [bp-10]

fld1

fadd

fmul

fld1

fdivr

jmp short @2@58

@2@58:

mov sp,bp

pop bp

ret

@erfc$qf endp

_main proc far

push bp

mov bp,sp

sub sp,2

mov word ptr DGROUP:_done,0

push ds

mov ax,offset DGROUP:s@+44

push ax

call far ptr _printf

pop cx

pop cx

@3@58:

push ds

mov ax,offset DGROUP:s@+46

push ax

call far ptr _printf

pop cx

pop cx

push ds

mov ax,offset DGROUP:_x

push ax

push ds

mov ax,offset DGROUP:s@+52

push ax

call far ptr _scanf

add sp,8

fld dword ptr DGROUP:_x

fldz

fcompp

fstsw word ptr [bp-2]

fwait

mov ax,word ptr [bp-2]

sahf

jbe short @3@114

mov word ptr DGROUP:_done,1

jmp @3@310

@3@114:

fld dword ptr DGROUP:_x

fldz

fcompp

fstsw word ptr [bp-2]

fwait

mov ax,word ptr [bp-2]

sahf

jne short @3@170

mov word ptr DGROUP:_er+2,0

mov word ptr DGROUP:_er,0

mov word ptr DGROUP:_ec+2,16256

mov word ptr DGROUP:_ec,0

jmp short @3@282

@3@170:

fld dword ptr DGROUP:_x

fcomp dword ptr DGROUP:s@+55

fstsw word ptr [bp-2]

fwait

mov ax,word ptr [bp-2]

sahf

jae short @3@226

fld dword ptr DGROUP:_x

sub sp,4

fstp dword ptr [bp-6]

fwait

push cs

call near ptr @erf$qf

pop cx

pop cx

fstp dword ptr DGROUP:_er

fld dword ptr DGROUP:_er

fld1

fsubr

fstp dword ptr DGROUP:_ec

jmp short @3@254

@3@226:

fld dword ptr DGROUP:_x

sub sp,4

fstp dword ptr [bp-6]

fwait

push cs

call near ptr @erfc$qf

pop cx

pop cx

fstp dword ptr DGROUP:_ec

fld dword ptr DGROUP:_ec

fld1

fsubr

fstp dword ptr DGROUP:_er

@3@254:

fwait

@3@282:

fld dword ptr DGROUP:_ec

sub sp,8

fstp qword ptr [bp-10]

push ds

mov ax,offset DGROUP:s@+74

push ax

fld dword ptr DGROUP:_er

sub sp,8

fstp qword ptr [bp-22]

push ds

mov ax,offset DGROUP:s@+65

push ax

fld dword ptr DGROUP:_x

sub sp,8

fstp qword ptr [bp-34]

push ds

mov ax,offset DGROUP:s@+59

push ax

fwait

call far ptr _printf

add sp,36

@3@310:

cmp word ptr DGROUP:_done,0

jne @@1

jmp @3@58

@@1:

mov sp,bp

pop bp

ret

_main endp

Формулы расчета:

Пусть :

  • 1 - число простых (единых или отдельных) операторов появляющихся в данной реализации

  • 2 - число простых (единых или отдельных) операндов появляющихся в данной реализации

  • N1 - общее число всех операторов появляющихся в данной реализации

  • N2 - общее число всех операндов появляющихся в данной реализации

  • f1j - число вхождений j-го наиболее часто встречающегося оператора где j = 123 ... 1

  • f2j - число вхождений j-го наиболее часто встречающегося операнда где j = 123 ... 2

словарьреализации

 = 1 + 2

длину N реализации

N = N1 + N2

где :

уравнение длины программы

1 log21 + 2 log22

объем программы

V = N log2

где: N (или N1 + N2) -длина реализации;

 или (1 + 2) - ее словарь.

время программирования:

потенциальный объем программы

Если N1* = 1* ; N2* = 2*

V* = (1* + 2*) log2(1* + 2*)

граничный объем программы

V**= (1*log2 1* + 2*log2 2*) log2(1* + 1*)

уровень программы

Полученные результаты измерений:

Для языка Паскаль можно воспользоваться программами автоматизации расчёта метрических характеристик по Холстеду Parser_Pas.exe и Metrics.exe. Ниже приведены результаты работы программы Metrics.exe:

Operators:

Operands:

1 | 37 | ()

| 2 | 31 | *

| 3 | 23 | +

| 4 | 3 | -

| 5 | 14 | /

| 6 | 47 | ;

| 7 | 2 | <

| 8 | 30 | =

| 9 | 1 | boolean

| 10 | 2 | const

| 11 | 2 | erf

| 12 | 2 | erfc

| 13 | 2 | exp

| 14 | 2 | function

| 15 | 3 | if

| 16 | 1 | integer

| 17 | 1 | program

| 18 | 1 | readln

| 19 | 7 | real

| 20 | 1 | repeat

| 21 | 1 | write

| 22 | 2 | writeln

| 1 | 1 | ', Erf= '

| 2 | 1 | ', Erfc= '

| 3 | 1 | 'Arg? '

| 4 | 1 | 'X= '

| 5 | 3 | 0.0

| 6 | 1 | 0.01693122

| 7 | 1 | 0.07619048

| 8 | 2 | 0.66666667

| 9 | 13 | 1

| 10 | 5 | 1.0

| 11 | 1 | 1.5

| 12 | 2 | 1.7724538

| 13 | 1 | 10

| 14 | 1 | 11

| 15 | 3 | 12

| 16 | 1 | 2

| 17 | 2 | 2.0

| 18 | 1 | 3

| 19 | 1 | 3.078403E-3

| 20 | 2 | 4

| 21 | 1 | 4.736005E-4

| 22 | 1 | 5

| 23 | 1 | 6

| 24 | 1 | 6.314673E-5

| 25 | 1 | 6.476214E-9

| 26 | 1 | 7

| 27 | 1 | 7.429027E-6

| 28 | 1 | 7.447646E-8

| 29 | 1 | 7.820028E-7

| 30 | 2 | 8

| 31 | 1 | 9

| 32 | 4 | done

| 33 | 6 | ec

| 34 | 6 | er

| 35 | 1 | erf

| 36 | 1 | erfc

| 37 | 1 | erfd4

| 38 | 1 | false

| 39 | 1 | i

| 40 | 4 | sqrtpi

| 41 | 8 | sum

| 42 | 2 | t10

| 43 | 2 | t11

| 44 | 2 | t12

| 45 | 2 | t2

| 46 | 2 | t3

| 47 | 2 | t4

| 48 | 2 | t5

| 49 | 2 | t6

| 50 | 2 | t7

| 51 | 2 | t8

| 52 | 2 | t9

| 53 | 1 | true

| 54 | 14 | v

| 55 | 16 | x

| 56 | 18 | x2

Summary:

=====================================

The number of different operators 1 : 22

The number of different operands 2 : 56

The total number of operators N1 : 215

The total number of operands N2 : 160

Dictionary ( D) : 78

Length ( N) N: 375

Length estimation ( ^N) : 423.319

Volume ( V) : 2357.03

Potential volume ( *V) : 11.6096

Limit volume (**V) : 15.6843

Programming level ( L) : 0,00492

Programming level estimation ( ^L) : 0.0318182

Intellect ( I) : 74.9964

Time of programming ( T) : 7407,7954

Time estimation ( ^T) : 8362,30219

Programming language level (lambda) : 0,057119

Work on programming ( E) : 479071,13

Error estimation ( ^B) : 0.785676

Для языка Си можно воспользоваться программами автоматизации расчёта метрических характеристик по Холстеду Parser_C.exe и Metrics.exe. Ниже приведены результаты работы программы Metrics.exe:

Operators:

Operands:

| 1 | 37 | ()

| 2 | 31 | *

| 3 | 23 | +

| 4 | 2 | -

| 5 | 14 | /

| 6 | 28 | ;

| 7 | 2 | <

| 8 | 27 | =

| 9 | 2 | ==

| 10 | 2 | const

| 11 | 1 | dowhile

| 12 | 2 | erf

| 13 | 2 | erfc

| 14 | 2 | exp

| 15 | 7 | float

| 16 | 3 | if

| 17 | 2 | int

| 18 | 1 | main

| 19 | 3 | printf

| 20 | 2 | return

| 21 | 1 | scanf

| 22 | 1 | void

| 1 | 1 | " Erf= %f"

| 2 | 1 | "%f"

| 3 | 1 | ", Erfc= %f"

| 4 | 1 | "Arg? "

| 5 | 1 | "X= %f"

| 6 | 1 | "\n"

| 7 | 2 | 0

| 8 | 3 | 0.0

| 9 | 1 | 0.01693122

| 10 | 1 | 0.07619048

| 11 | 2 | 0.66666667

| 12 | 14 | 1

| 13 | 5 | 1.0

| 14 | 1 | 1.5

| 15 | 2 | 1.7724538

| 16 | 1 | 10

| 17 | 1 | 11

| 18 | 1 | 12

| 19 | 1 | 2

| 20 | 2 | 2.0

| 21 | 1 | 3

| 22 | 1 | 3.078403E-3

| 23 | 1 | 4

| 24 | 1 | 4.736005E-4

| 25 | 1 | 5

| 26 | 1 | 6

| 27 | 1 | 6.314673E-5

| 28 | 1 | 6.476214E-9

| 29 | 1 | 7

| 30 | 1 | 7.429027E-6

| 31 | 1 | 7.447646E-8

| 32 | 1 | 7.820028E-7

| 33 | 1 | 8

| 34 | 1 | 9

| 35 | 4 | done

| 36 | 6 | ec

| 37 | 6 | er

| 38 | 1 | i

| 39 | 4 | sqrtpi

| 40 | 8 | sum

| 41 | 2 | t10

| 42 | 2 | t11

| 43 | 2 | t12

| 44 | 2 | t2

| 45 | 2 | t3

| 46 | 2 | t4

| 47 | 2 | t5

| 48 | 2 | t6

| 49 | 2 | t7

| 50 | 2 | t8

| 51 | 2 | t9

| 52 | 14 | v

| 53 | 16 | x

| 54 | 18 | x2

Summary:

=====================================

The number of different operators 1 : 22

The number of different operands 2 : 54

The total number of operators N1 : 205

The total number of operands N2 : 156

Dictionary ( D) : 76

Length ( N) N: 361

Length estimation ( ^N) : 408,871

Volume ( V) : 2255,502

Potential volume ( *V) : 11.6096

Limit volume (**V) : 13,5097

Programming level ( L) : 0,00514

Programming level estimation ( ^L) : 0,03146

Intellect ( I) : 70,9580

Time of programming ( T) : 7167,48

Time estimation ( ^T) : 8117,94

Programming language level (lambda) : 0,05967

Work on programming ( E) : 438813,618

Error estimation ( ^B) : 0,75183

Легко убедиться, что метрические характеристики программ на языках Паскаль и Си практически идентичны. Это можно объяснить близостью синтаксических конструкций языков.

К сожалению, программных средств автоматизации подсчёта метрических характеристик для языка Ассемблера найти не удалось, поэтому все метрики были посчитаны вручную. Результаты этой занимательной работы приведены ниже:

Измеряемые характеристики программ

N

Ассемблер

Число вхождений i-го операнда в тексте программы

1

12

Bp

2

20

Sp

3

8

[bp-2]

4

1

[bp-4]

5

6

[bp-6]

6

1

[bp-8]

7

15

[bp-10]

8

1

[bp-12]

9

5

[bp-14]

10

1

[bp-16]

11

1

[bp-18]

12

1

[bp-20]

13

3

[bp-22]

14

1

[bp-24]

15

6

[bp+6]

16

13

[bp-28]

17

2

[bp-32]

18

1

[bp-40]

19

1

[bp-34]

20

20

DGROUP:s@

21

3

DGROUP:_done

22

7

DGROUP:_x

23

6

DGROUP:_er

24

6

DGROUP:_ec

25

8

cx

26

17

ax

27

7

ds

28

2

cs

29

3

@erf$qf

30

2

32

31

3

1

32

15

0

33

9

8

34

1

14

35

3

4

36

1

44

37

1

46

38

1

52

39

1

55

40

1

59

41

1

65

42

1

74

43

2

2

44

1

12

45

1

16

46

1

2,16256

47

1

20

48

1

24

49

1

28

50

1

32

51

2

36

52

1

40

53

54

55

     

Число вхождений j-го оператора в тексте программы

1

19

Push

2

35

Mov

3

10

sub

4

3

proc

5

28

fld

6

31

fmul

7

17

fstp

8

13

fldz

9

23

fadd

10

1

fchs

11

9

fwait

12

2

Call far ptr _exp

13

3

Call far ptr _printf

14

1

Call far ptr _scanf

15

1

Call near ptr @erf$qf

16

1

Call near ptr @erfc$qf

17

4

add

18

19

fld1

19

3

fdiv

20

1

Jmp @1@58

21

11

pop

22

3

ret

23

11

fdivr

24

1

Jmp @2@58

25

2

fcompp

26

3

fstsw

27

3

sahf

28

1

jbe

29

1

Jmp @3@310

30

1

Jmp @3@282

31

1

jae

32

2

fsubr

33

1

cmp

34

1

Jne @@1

35

1

Jmp @3@58

36

3

endp

Измеряемые характеристики программ

Ассемблер

Число простых (отдельных)

операторов

1

36

Число простых (отдельных)

операндов

2

52

Общее число всех операторов в данной реализации

N1

270

Общее число всех операндов в данной реализации

N2

230

Словарь программы

88

Длина программы

N

500

Оценки характеристик программы

Ассемблер

Эталонная длина программы

^N

482,5401

Реальный объем программы

V

3229,7158

Потенциальный объем программы

*V

11,6096

Граничный объем программы

**V

13,5097

Уровень программы

L

0,00359

Эталонный уровень программы

^L

0,0126

Интеллектуальное содержание программы

I

39,7819

Время программирования

T

25713,5066

Оценивание программ.

^T

24815,5994

Уровень используемого языка программирования

lambda

0,0416

Работа программиста

E

899642,284

Ожидаемое число ошибок

в программе

B

4,9308

Соседние файлы в папке Лабораторная работа №13