67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								% ----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								% The Computer Language Benchmarks Game
							 | 
						||
| 
								 | 
							
								% http://shootout.alioth.debian.org/
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% Based on D language implementation by David Fladebo
							 | 
						||
| 
								 | 
							
								% Contributed by Anthony Borla
							 | 
						||
| 
								 | 
							
								% Modified to run with YAP by Glendon Holst
							 | 
						||
| 
								 | 
							
								% ----------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- yap_flag(unknown,error).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- initialization(main).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main :-
							 | 
						||
| 
								 | 
							
								  unix( argv([H|_]) ), number_atom(N,H),
							 | 
						||
| 
								 | 
							
								  compute_sums(N, SUMS),
							 | 
						||
| 
								 | 
							
								  print_sums(SUMS),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  statistics,
							 | 
						||
| 
								 | 
							
								  statistics_jit.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								compute_sums(N, SUMS) :-
							 | 
						||
| 
								 | 
							
								  SUMS0 = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
							 | 
						||
| 
								 | 
							
								  compute_sums_(1.0, N, 1.0, SUMS0, SUMS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								compute_sums_(D, N, _, SUMS, SUMS) :- D > N, !.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								compute_sums_(D, N, ALT, SUMS0, SUMS) :-
							 | 
						||
| 
								 | 
							
								  SUMS0 = [A1, A2, A3, A4, A5, A6, A7, A8, A9],
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  D2 is D * D, D3 is D2 * D, DS is sin(D), DC is cos(D),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  A1N is A1 + (2 / 3.0) ** (D - 1.0),
							 | 
						||
| 
								 | 
							
								  A2N is A2 + 1 / sqrt(D),
							 | 
						||
| 
								 | 
							
								  A3N is A3 + 1 / (D * (D + 1)),
							 | 
						||
| 
								 | 
							
								  A4N is A4 + 1 / (D3 * DS * DS),
							 | 
						||
| 
								 | 
							
								  A5N is A5 + 1 / (D3 * DC * DC),
							 | 
						||
| 
								 | 
							
								  A6N is A6 + 1 / D,
							 | 
						||
| 
								 | 
							
								  A7N is A7 + 1 / (D2),
							 | 
						||
| 
								 | 
							
								  A8N is A8 + ALT / D,
							 | 
						||
| 
								 | 
							
								  A9N is A9 + ALT / (2 * D - 1),
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  SUMS1 = [A1N, A2N, A3N, A4N, A5N, A6N, A7N, A8N, A9N],
							 | 
						||
| 
								 | 
							
								  DN is D + 1.0, ALTN is -ALT, !,
							 | 
						||
| 
								 | 
							
								  compute_sums_(DN, N, ALTN, SUMS1, SUMS).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								print_sums(SUMS) :-
							 | 
						||
| 
								 | 
							
								  SUMS = [A1, A2, A3, A4, A5, A6, A7, A8, A9],
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A1, '(2/3)^k']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A2, 'k^-0.5']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A3, '1/k(k+1)']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A4, 'Flint Hills']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A5, 'Cookson Hills']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A6, 'Harmonic']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A7, 'Riemann Zeta']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A8, 'Alternating Harmonic']),
							 | 
						||
| 
								 | 
							
								  format('~9f\t~w\n', [A9, 'Gregory']).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								% ------------------------------- %
							 |