November 2016

S M T W T F S
  1 2345
6789101112
13141516171819
20212223 242526
27282930   

Style Credit

Expand Cut Tags

No cut tags
Thursday, October 18th, 2007 12:28 am
Вот
программа на Фортране:

PROGRAM test

REAL, PARAMETER :: R1=2, R2=2.3, R3=2.6, R4=2.9, R5=3.2, R6=3.5, R7=3.8
REAL :: x1 = 0.1, x2 = 0.1, x3 = 0.1, x4 = 0.1, x5 = 0.1, x6 = 0.1, x7 = 0.1
INTEGER :: i

DO i=1, 10000000

x1 = R1*x1*(1-x1)
x2 = R2*x2*(1-x2)
x3 = R3*x3*(1-x3)
x4 = R4*x4*(1-x4)
x5 = R5*x5*(1-x5)
x6 = R6*x6*(1-x6)
x7 = R7*x7*(1-x7)

END DO

WRITE(*,*) x1, x2, x3, x4, x5, x6, x7

END PROGRAM test



А вот
программа на C:


int main()
{
double x1 = 0.1, x2 = 0.1, x3 = 0.1, x4 = 0.1, x5 = 0.1, x6 = 0.1, x7 = 0.1 ;
double r1 = 2, r2 = 2.3, r3 = 2.6, r4 = 2.9, r5 = 3.2, r6 = 3.5, r7 = 3.8;

int i;

for (i=1; i<=10000000; i++) {
x1 = r1*x1*(1-x1);
x2 = r2*x2*(1-x2);
x3 = r3*x3*(1-x3);
x4 = r4*x4*(1-x4);
x5 = r5*x5*(1-x5);
x6 = r6*x6*(1-x6);
x7 = r7*x7*(1-x7);
}
printf("%f\t%f\t%f\t%f\t%f\t%f\t%f\n", x1, x2, x3, x4, x5, x6, x7);
return 0;

}


А вот результаты их работы:

alexey@pippurini:/tmp$ gfortran test1f.f90 -o test1f

alexey@pippurini:/tmp$ ./test1f

0.5000000 0.5652174 0.6153846 0.6551723 0.5130445 0.8269408 0.7763757

alexey@pippurini:/tmp$ gcc test1.c -o test1

alexey@pippurini:/tmp$ ./test1

0.500000 0.565217 0.615385 0.655172 0.513045 0.826941 0.186553


Предлагается объяснить, что происходит. Я думаю, что знаю.

Комменты скринятся.
Thursday, October 18th, 2007 05:03 am (UTC)
Разное количество итераций?
Thursday, October 18th, 2007 06:42 am (UTC)
x= (r-1) /r
Thursday, October 18th, 2007 12:13 pm (UTC)
Мантисса в С переполняется быстрее, чем в Фортране? Сколько байт там и там?
Saturday, March 8th, 2008 11:41 pm (UTC)
Хмм... А с каких это пор double это real? С float будет работать адекватно, а с double – никогда.
Thursday, May 15th, 2008 07:11 pm (UTC)
double: 0.859363
long double: 0.299181
Overflow bug?