2007-12-20

計算時間的副程式

关键字: C
精確度可以到 10 ms

// file: psc51.cpp
// for time1(), time2()

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/timeb.h>
#include <time.h>
// ----------------------------------------------

#include "sj01.h"
// ----------------------------------------------

//   time1(&t1);
void time1(long *t1)
{
/* FTIME.C: This program uses _ftime to obtain the current
 * time and then stores this time in timebuffer.

millitm
Fraction of a second in milliseconds.

time
Time in seconds since midnight (00:00:00), January 1, 1970, coordinated universal time (UTC).
 */

   struct _timeb timebuffer;
   // char *timeline;
   long t2, t3, t4, t5, t6;

   _ftime( &timebuffer );
   // timeline = ctime( & ( timebuffer.time ) );

   t2= timebuffer.time;// 秒
   t3= t2%(1L*24L*60L*60L);
   t4= t3*1000L;

   t5= timebuffer.millitm;// 千分之ㄧ秒
   t6= t4 + t5;
   *t1= t6;

   // printf( "The time is %.19s.%hu %s", timeline, timebuffer.millitm, &timeline[20] );
   // printf("%ld, %ld, %ld, %ld, %ld, \n", 
   //	       t2,  t3,  t4,  t5,  t6);
}// end of time1()
// ----------------------------------------------

//   time2(     t1,        &dt);
void time2(long t1, double *dt)
{
	long t2;
	time1(&t2);

	*dt= (t2 - t1)/1000.0;

	// (*dt) >= 0
	if ((*dt) < 0) {
		(*dt)+= 1.0*24.0*60.0*60.0;
	}
}// end of time2()
// ----------------------------------------------

void main()
{
	int no, sum, i, ct1= 0;
	long t1;
	double dt;
	// ----------------------------------------------

	no= 10;
	skip(3);
	while (no > 0) {
		time1(&t1);

		sum= 0;
		for (i=1;i<=no;i++) {
			sum+= i;
		}
		time2(t1, &dt);
		// ----------------------------------------------

		ct1++;
		printf("ct1= %3ld, no= %12ld, sum= %12ld, t1= %8ld, dt= %8.4lf\n", 
			ct1, no, sum, t1, dt);

		if (dt > 0) {
			pause();
		}

		if (ct1>=16) {
			// break;
		}

		no*= 2;
	}

	skip(1);
	printf("*** end of program!\n");
}// end of main()
评论
sjgau 2007-12-20
以下程式,可以證明 最小的時間間隔是
10 ms

// file: psc51.cpp
// for time1(), time2(), min. dt= 0.01 second, 10 ms

/*
no=   2000000000, sum=  -1973237248, dt=     9.9840
no=   1818181818, sum=    996434927, dt=     9.0630
no=   1652892561, sum=  -1341125159, dt=     8.2520
no=   1502629601, sum=   -796977071, dt=     7.4910
no=   1366026910, sum=    574788113, dt=     6.8100
no=   1241842646, sum=  -1808278179, dt=     6.1890
no=   1128947860, sum=   -626730222, dt=     5.6380
no=   1026316236, sum=   -525053650, dt=     5.1270
no=    933014760, sum=  -1953325164, dt=     4.6570
no=    848195236, sum=  -1742216230, dt=     4.2260
no=    771086578, sum=    478252763, dt=     3.8450
no=    700987798, sum=    512634557, dt=     3.4950
no=    637261635, sum=  -1422935706, dt=     3.1650
no=    579328759, sum=    891927204, dt=     2.8940
no=    526662508, sum=   1623693438, dt=     2.6240
no=    478784098, sum=  -1385563149, dt=     2.3830
no=    435258271, sum=    511561776, dt=     2.1740
no=    395689337, sum=   -128593835, dt=     1.9720
no=    359717579, sum=   -939025438, dt=     1.7930
no=    327015981, sum=  -1121912565, dt=     1.6320
no=    297287256, sum=  -1212973492, dt=     1.4820
no=    270261141, sum=   1592856615, dt=     1.3420
no=    245691947, sum=  -1959145294, dt=     1.2220
no=    223356315, sum=  -1462032198, dt=     1.1120
no=    203051195, sum=    163962026, dt=     1.0110
no=    184591996, sum=  -1885152954, dt=     0.9210
no=    167810905, sum=  -1413653979, dt=     0.8320
no=    152555368, sum=    585667796, dt=     0.7610
no=    138686698, sum=   1458987879, dt=     0.6910
no=    126078817, sum=  -1654396655, dt=     0.6310
no=    114617106, sum=  -2042659797, dt=     0.5710
no=    104197369, sum=   -699008107, dt=     0.5200
no=     94724881, sum=   -990722791, dt=     0.4710
no=     86113528, sum=   1938134684, dt=     0.4310
no=     78285026, sum=  -1795049421, dt=     0.3900
no=     71168205, sum=  -2009564549, dt=     0.3610
no=     64698368, sum=   1879940096, dt=     0.3200
no=     58816698, sum=  -1577963537, dt=     0.2910
no=     53469726, sum=  -1024037167, dt=     0.2800
no=     48608841, sum=   1671809933, dt=     0.2400
no=     44189856, sum=   1088312912, dt=     0.2210
no=     40172596, sum=   1774039906, dt=     0.1900
no=     36520542, sum=   -264835471, dt=     0.1900
no=     33200493, sum=   1885931755, dt=     0.1600
no=     30182266, sum=   -971169585, dt=     0.1610
no=     27438424, sum=   1160863180, dt=     0.1300
no=     24944021, sum=    443177767, dt=     0.1300
no=     22676383, sum=   -442920912, dt=     0.1100
no=     20614894, sum=   2020588057, dt=     0.1000
no=     18740812, sum=    698748526, dt=     0.0900
no=     17037102, sum=    190898617, dt=     0.0910
no=     15488275, sum=   2082273854, dt=     0.0800
no=     14080250, sum=  -1118120305, dt=     0.0700
no=     12800227, sum=    705821974, dt=     0.0600
no=     11636570, sum=   -977953409, dt=     0.0600
no=     10578700, sum=   -381797938, dt=     0.0600
no=      9617000, sum=   -563567532, dt=     0.0400
no=      8742727, sum=   1023069820, dt=     0.0500
no=      7947934, sum=   -358086639, dt=     0.0400
no=      7225394, sum=  -1648384773, dt=     0.0300
no=      6568540, sum=   -758577738, dt=     0.0400
no=      5971400, sum=    402720004, dt=     0.0300
no=      5428545, sum=  -1479669791, dt=     0.0200
no=      4935041, sum=   1085019201, dt=     0.0300
no=      4486401, sum=    790835073, dt=     0.0200
no=      4078546, sum=  -2080876021, dt=     0.0200
no=      3707769, sum=   1829658965, dt=     0.0200
no=      3370699, sum=  -1434172958, dt=     0.0210
no=      3064272, sum=    483722600, dt=     0.0100
no=      2785702, sum=   1713740965, dt=     0.0100
no=      2532456, sum=  -1672607916, dt=     0.0200
no=      2302233, sum=    144722629, dt=     0.0100
no=      2092939, sum=   -235445630, dt=     0.0100
no=      1902672, sum=   1900089512, dt=     0.0100
no=      1729702, sum=   1286750245, dt=     0.0100
no=      1572456, sum=   -640859052, dt=     0.0100
no=      1429505, sum=   -459229183, dt=     0.0000
no=      1299550, sum=  -1692806287, dt=     0.0100
no=      1181409, sum=   2079501393, dt=     0.0000
no=      1074008, sum=   1221511372, dt=     0.0000
no=       976371, sum=    -90716850, dt=     0.0100
no=       887610, sum=  -1210791377, dt=     0.0000
no=       806918, sum=   -858781675, dt=     0.0000
no=       733562, sum=  -1525968945, dt=     0.0100
no=       666875, sum=   -976833142, dt=     0.0000
no=       606250, sum=   -913759353, dt=     0.0000
no=       551136, sum=   1551865456, dt=     0.0100
no=       501033, sum=    963232477, dt=     0.0000
no=       455484, sum=    653849766, dt=     0.0000
no=       414076, sum=   -169671994, dt=     0.0000
no=       376433, sum=   2131613225, dt=     0.0100
no=       342212, sum=  -1574844566, dt=     0.0000
no=       311102, sum=   1147742497, dt=     0.0000
no=       282820, sum=   1339011946, dt=     0.0000
no=       257109, sum=  -1307090873, dt=     0.0000
no=       233735, sum=   1546338204, dt=     0.0000
no=       212486, sum=   1100419861, dt=     0.0000
no=       193169, sum=   1477358681, dt=     0.0100
no=       175609, sum=  -1760520939, dt=     0.0000
no=       159644, sum=   -141718698, dt=     0.0000
no=       145131, sum=   1941641554, dt=     0.0000
no=       131937, sum=    113817361, dt=     0.0000
no=       119943, sum=  -1396712996, dt=     0.0000
no=       109039, sum=   1649838984, dt=     0.0000
no=        99126, sum=    618064205, dt=     0.0000
no=        90115, sum=   -234565626, dt=     0.0000
no=        81922, sum=   -939319293, dt=     0.0000
no=        74475, sum=  -1521667246, dt=     0.0000
no=        67704, sum=  -2003017636, dt=     0.0000
no=        61549, sum=   1894170475, dt=     0.0000
no=        55954, sum=   1565453035, dt=     0.0000
no=        50867, sum=   1293751278, dt=     0.0000
no=        46243, sum=   1069230646, dt=     0.0000
no=        42039, sum=    883659780, dt=     0.0000
no=        38217, sum=    730288653, dt=     0.0000
no=        34743, sum=    603555396, dt=     0.0000
no=        31584, sum=    498790320, dt=     0.0000
no=        28713, sum=    412232541, dt=     0.0100
no=        26103, sum=    340696356, dt=     0.0000
no=        23730, sum=    281568315, dt=     0.0000
no=        21572, sum=    232686378, dt=     0.0000
no=        19611, sum=    192305466, dt=     0.0000
no=        17828, sum=    158927706, dt=     0.0000
no=        16208, sum=    131357736, dt=     0.0000
no=        14734, sum=    108552745, dt=     0.0000
no=        13395, sum=     89719710, dt=     0.0000
no=        12177, sum=     74145753, dt=     0.0000
no=        11070, sum=     61277985, dt=     0.0000
no=        10063, sum=     50637016, dt=     0.0000
no=         9148, sum=     41847526, dt=     0.0000
no=         8317, sum=     34590403, dt=     0.0000
no=         7561, sum=     28588141, dt=     0.0000
no=         6873, sum=     23622501, dt=     0.0000
no=         6248, sum=     19521876, dt=     0.0000
no=         5680, sum=     16134040, dt=     0.0000
no=         5164, sum=     13336030, dt=     0.0000
no=         4694, sum=     11019165, dt=     0.0000
no=         4268, sum=      9110046, dt=     0.0000
no=         3880, sum=      7529140, dt=     0.0000
no=         3527, sum=      6221628, dt=     0.0000
no=         3206, sum=      5140821, dt=     0.0000
no=         2915, sum=      4250070, dt=     0.0000
no=         2650, sum=      3512575, dt=     0.0000
no=         2409, sum=      2902845, dt=     0.0000
no=         2190, sum=      2399145, dt=     0.0000
no=         1991, sum=      1983036, dt=     0.0000
no=         1810, sum=      1638955, dt=     0.0000
no=         1645, sum=      1353835, dt=     0.0000
no=         1495, sum=      1118260, dt=     0.0000
no=         1359, sum=       924120, dt=     0.0000
no=         1236, sum=       764466, dt=     0.0000
no=         1123, sum=       631126, dt=     0.0000
no=         1021, sum=       521731, dt=     0.0000
no=          928, sum=       431056, dt=     0.0000
no=          844, sum=       356590, dt=     0.0000
no=          767, sum=       294528, dt=     0.0000
no=          697, sum=       243253, dt=     0.0000
no=          634, sum=       201295, dt=     0.0000
no=          576, sum=       166176, dt=     0.0000
no=          524, sum=       137550, dt=     0.0000
no=          476, sum=       113526, dt=     0.0000
no=          433, sum=        93961, dt=     0.0000
no=          393, sum=        77421, dt=     0.0000
no=          358, sum=        64261, dt=     0.0000
no=          325, sum=        52975, dt=     0.0000
no=          295, sum=        43660, dt=     0.0000
no=          269, sum=        36315, dt=     0.0000
no=          244, sum=        29890, dt=     0.0000
no=          222, sum=        24753, dt=     0.0000
no=          202, sum=        20503, dt=     0.0000
no=          183, sum=        16836, dt=     0.0000
no=          167, sum=        14028, dt=     0.0000
no=          151, sum=        11476, dt=     0.0000
no=          138, sum=         9591, dt=     0.0000
no=          125, sum=         7875, dt=     0.0000
no=          114, sum=         6555, dt=     0.0000
no=          103, sum=         5356, dt=     0.0000
no=           94, sum=         4465, dt=     0.0000
no=           85, sum=         3655, dt=     0.0000
no=           77, sum=         3003, dt=     0.0000
no=           70, sum=         2485, dt=     0.0000
no=           64, sum=         2080, dt=     0.0000
no=           58, sum=         1711, dt=     0.0000
no=           53, sum=         1431, dt=     0.0000
no=           48, sum=         1176, dt=     0.0000
no=           43, sum=          946, dt=     0.0000
no=           39, sum=          780, dt=     0.0000
no=           36, sum=          666, dt=     0.0000
no=           33, sum=          561, dt=     0.0000
no=           30, sum=          465, dt=     0.0000
no=           27, sum=          378, dt=     0.0000
no=           24, sum=          300, dt=     0.0000
no=           22, sum=          253, dt=     0.0000
no=           20, sum=          210, dt=     0.0000
no=           18, sum=          171, dt=     0.0000
no=           16, sum=          136, dt=     0.0000
no=           15, sum=          120, dt=     0.0000
no=           14, sum=          105, dt=     0.0000
no=           12, sum=           78, dt=     0.0000
no=           11, sum=           66, dt=     0.0000

*** end of program! dt_min=     0.0100
Press any key to continue
  */

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/timeb.h>
#include <time.h>
// ----------------------------------------------

#include "sj01.h"
#include "sj02.h"
// ----------------------------------------------

//  get_sum(no);
int get_sum(int no)
{
	int sum= 0;
	for (int i=1;i<=no;i++) {
		sum+= i;
	}
	return(sum);
}// end of get_sum()
// ----------------------------------------------

void main()
{
	int no, sum, t1;
	double x1= 20e8, dt, dt_min= 999;
	// ----------------------------------------------

	skip(3);
	no= (int) x1;
	while (no > 10) {
		time1(&t1);
		sum= get_sum(no);
		time2(t1, &dt);
		// ----------------------------------------------

		printf("no= %12ld, sum= %12ld, dt= %10.4lf\n", 
		    no, sum, dt);

		if (dt > 0) {
			// dt_min must <= any dt
			if (dt_min > dt) {
				dt_min= dt;
			}
		}

		x1/= 1.1;
		no= (int) x1;
	}

	skip(1);
	printf("*** end of program! dt_min= %10.4lf\n", dt_min);
}// end of main()

发表评论

您还没有登录,请登录后发表评论

sjgau
  • 浏览: 43093 次
  • 性别: Icon_minigender_1
  • 来自: 台灣省 台北市
  • 详细资料
搜索本博客
博客分类
最近加入圈子
存档
最新评论