f=fa-fb C(a,b) cos(f) C-cosf err(cos(f/2)^2)
0 -1.0000 -1.0000 0.0000 0.0000
7.5 -0.9919 -0.9914 -0.0004 0.0002
15 -0.9670 -0.9659 -0.0011 0.0005
22.5 -0.9249 -0.9239 -0.0010 0.0005
30 -0.8673 -0.8660 -0.0013 0.0006
37.5 -0.7941 -0.7934 -0.0007 0.0004
45 -0.7073 -0.7071 -0.0002 0.0001
52.5 -0.6088 -0.6088 0.0000 0.0000
60 -0.5010 -0.5000 -0.0010 0.0005
67.5 -0.3831 -0.3827 -0.0004 0.0002
75 -0.2589 -0.2588 0.0000 0.0000
82.5 -0.1303 -0.1305 0.0002 -0.0001
90 -0.0001 0.0000 -0.0001 0.0001
97.5 0.1307 0.1305 0.0002 -0.0001
105 0.2596 0.2588 0.0008 -0.0004
112.5 0.3832 0.3827 0.0005 -0.0003
120 0.5006 0.5000 0.0006 -0.0003
127.5 0.6093 0.6088 0.0005 -0.0002
135 0.7077 0.7071 0.0006 -0.0003
142.5 0.7940 0.7934 0.0007 -0.0003
150 0.8673 0.8660 0.0013 -0.0007
157.5 0.9248 0.9239 0.0010 -0.0005
165 0.9670 0.9659 0.0010 -0.0005
172.5 0.9919 0.9914 0.0004 -0.0002
180 1.0000 1.0000 0.0000 0.0000
max|C-cosf| = 0.0013042
jak widać błąd w praktyce niewykrywalny ~ 0.1%
Kod dla miłośników fantastyki naukowej.
#define N (1024*1024*8) // liczba pomiarów na jeden kąt
#define K 24 // liczba kątów
// float Corr(float fa, float fb) // |cosf| >= f(t) -> Z = sgn(cosf);
float crmax = 0; // maksymalny błąd
for(int k = 0; k <= K; k++)
{
float fa = 0, fb = rad(180.0 *k/K);
int sumeq = 0, sumdiff = 0; // liczniki zgodnych i niezgodnych 'spinów'/wyników
for(int i = N; --i >= 0; )
{
// tworzymy dwie zmienne lokalne: f i q (wedle teorii Einsteina są one konieczne)
float f = rndf()*(2*M_PI), // losowy kąt - 0..2pi
q = rndf(); // rndf daje losową od 0 do 1
// testowanie koincydencji, czyli zgodnych par pomiarów (dowolna funkcja, która spełnia warunki lokalności)
q = phi*(2/sqrt(1 + 3*q)-1) + (1-phi)*0.5*(1-q); // phi = 0.618...
int a = 0, b = 0;
// test na stanowisku A:
float c = cos(f-fa);
if( fabs(c) >= q ) a = (c > 0) ? 1 : -1;
// test na stanowisku B:
c = cos(f-fb);
if( fabs(c) >= q ) b = (c > 0) ? 1 : -1;
// wyznaczenie koincydencji z obu pomiarów
if( a && b )
if( a == b ) sumeq++; else sumdiff++;
}
// --------- drukujemy wyniki ----------
int n = sumeq+sumdiff; // sumaryczna liczba koincydencji
float cr = (double)(-sumeq+sumdiff)/n, cs = -cos(fa-fb),
c2 = (double)(sumeq)/n - sqr(cos(0.5*(fa-fb)));
s += sprintf(s, "%4g \t%.4f \t%.4f \t%.4f \t%.4f\r\n", 180.0*k/K, cr, cs, cr-cs, c2);
// można użyć: writeln, itp.
if( (cr=fabs(cr-cs)) > crmax ) crmax = cr;
if( k == K ) s += sprintf(s, "max|C-cosf| = %g", crmax);
}
// wyniki można zapisać albo wywalić na ekran, np. tak:
TFileIO f; f.createnew("epr.txt");
f.write(bigstr, strlen(bigstr));
tak się produkuje efekty nielokalne z fizyki kwantowej... w domowym pececie. :)