-
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.
-
Текст программы на языке С++:
#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);
}
-
Текст программы на языке Ассемблера:
@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 = 123 ... 1
-
f2j - число вхождений j-го наиболее часто встречающегося операнда где j = 123 ... 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 |