fork(2) download
  1. /**
  2.  * Kelas Logarithm untuk menghitung logaritma. Metode perhitungan menggunakan Binary
  3.  * Logarithm, yaitu logaritma dalam basis 2.
  4.  *
  5.  * @author Hendra Jaya
  6.  * @since 17 Oktober 2010
  7.  */
  8. class Logarithm {
  9. /**
  10. * Nilai lb(10) dan lb(e).
  11. * Dipersiapkan untuk Common Logarithm dan Natural Logarithm.
  12. * Kedua nilai dihitung menggunakan toleransi galat {10}^{-20}
  13. */
  14. private static final double lb_10 = 3.321928094887362D;
  15. private static final double lb_e = 1.4426950408889634D;
  16.  
  17. /**
  18.   * Toleransi galat. Di-set ke {10}^{-20}. Cukup untuk penggunaan sehari-hari
  19.   */
  20. private static final double err = 1E-20D;
  21.  
  22. /**
  23.   * Common Logarithm. Logaritma dalam basis 10
  24.   * @param x bilangan real positif
  25.   * @return log_10(x)
  26.   */
  27. public static double log(double x){
  28. return lb(x) / lb_10;
  29. }
  30.  
  31. /**
  32.   * Logarithm. Logaritma dalam basis sesuai keinginan user
  33.   * @param base bilangan real positif yang akan dijadikan basis logaritma
  34.   * @param x bilangan real positif
  35.   * @return log_base(x)
  36.   */
  37. public static double log(double base, double x){
  38. return lb(x) / lb(base);
  39. }
  40.  
  41. /**
  42.   * Natural Logarithm. Logaritma dalam basis e. Yang dimaksud dengan e adalah
  43.   * bilangan Euler, yaitu 2.71828182845904523536...
  44.   * @param x bilangan real positif
  45.   * @return log_e(x)
  46.   */
  47. public static double ln(double x){
  48. return lb(x) / lb_e;
  49. }
  50.  
  51. /**
  52.   * Binary Logarithm. Logaritma dalam basis 2
  53.   * @param x
  54.   * @return log_2(x)
  55.   */
  56. public static double lb(double x){
  57. assert(x > 0D);
  58.  
  59. double result = 0D;
  60.  
  61. while (x < 1){
  62. result -= 1D;
  63. x *= 2D;
  64. }
  65.  
  66. while (x >= 2){
  67. result += 1D;
  68. x /= 2D;
  69. }
  70.  
  71. double frac = 1D;
  72. while(frac > err){
  73. frac /= 2D;
  74. x *= x;
  75.  
  76. if (x >= 2D){
  77. x /= 2D;
  78. result += frac;
  79. }
  80. }
  81.  
  82. return result;
  83. }
  84.  
  85. public static void main(String[] args) {
  86. System.out.println(4.5 + "\t" + lb(4.5) + "\t" + ln(4.5) + "\t" + log(4.5) + "\t" + log(4.5, Math.PI) + "\t" + log(4.5, 4.5));
  87. System.out.println(1.125 + "\t" + lb(1.125) + "\t" + ln(1.125) + "\t" + log(1.125) + "\t" + log(1.125, Math.PI) + "\t" + log(1.125, 1.125));
  88. System.out.println(1.28289 + "\t" + lb(1.28289) + "\t" + ln(1.28289) + "\t" + log(1.28289) + "\t" + log(1.28289, Math.PI) + "\t" + log(1.28289, 1.28289));
  89. System.out.println(1.6 + "\t" + lb(1.6) + "\t" + ln(1.6) + "\t" + log(1.6) + "\t" + log(1.6, Math.PI) + "\t" + log(1.6, 1.6));
  90. System.out.println(1.999999 + "\t" + lb(1.999999) + "\t" + ln(1.999999) + "\t" + log(1.999999) + "\t" + log(1.999999, Math.PI) + "\t" + log(1.999999, 1.999999));
  91. System.out.println(0.999999 + "\t" + lb(0.999999) + "\t" + ln(0.999999) + "\t" + log(0.999999) + "\t" + log(0.999999, Math.PI) + "\t" + log(0.999999, 0.999999));
  92. System.out.println(9.999999 + "\t" + lb(9.999999) + "\t" + ln(9.999999) + "\t" + log(9.999999) + "\t" + log(9.999999, Math.PI) + "\t" + log(9.999999, 9.999999));
  93. System.out.println(0.3 + "\t" + lb(0.3) + "\t" + ln(0.3) + "\t" + log(0.3) + "\t" + log(0.3, Math.PI) + "\t" + log(0.3, 0.3));
  94. System.out.println(0.9 + "\t" + lb(0.9) + "\t" + ln(0.9) + "\t" + log(0.9) + "\t" + log(0.9, Math.PI) + "\t" + log(0.9, 0.9));
  95. System.out.println(0.8 + "\t" + lb(0.8) + "\t" + ln(0.8) + "\t" + log(0.8) + "\t" + log(0.8, Math.PI) + "\t" + log(0.8, 0.8));
  96. System.out.println(1.4 + "\t" + lb(1.4) + "\t" + ln(1.4) + "\t" + log(1.4) + "\t" + log(1.4, Math.PI) + "\t" + log(1.4, 1.4));
  97. System.out.println(10 + "\t" + lb(10) + "\t" + ln(10) + "\t" + log(10) + "\t" + log(10, Math.PI) + "\t" + log(10, 10));
  98. System.out.println(100 + "\t" + lb(100) + "\t" + ln(100) + "\t" + log(100) + "\t" + log(100, Math.PI) + "\t" + log(100, 100));
  99. System.out.println(1 + "\t" + lb(1) + "\t" + ln(1) + "\t" + log(1) + "\t" + log(1, Math.PI) + "\t" + log(1, 1));
  100. System.out.println(1000 + "\t" + lb(1000) + "\t" + ln(1000) + "\t" + log(1000) + "\t" + log(1000, Math.PI) + "\t" + log(1000, 1000));
  101. System.out.println(0.1 + "\t" + lb(0.1) + "\t" + ln(0.1) + "\t" + log(0.1) + "\t" + log(0.1, Math.PI) + "\t" + log(0.1, 0.1));
  102. System.out.println(0.01 + "\t" + lb(0.01) + "\t" + ln(0.01) + "\t" + log(0.01) + "\t" + log(0.01, Math.PI) + "\t" + log(0.01, 0.01));
  103. System.out.println(0.001 + "\t" + lb(0.001) + "\t" + ln(0.001) + "\t" + log(0.001) + "\t" + log(0.001, Math.PI) + "\t" + log(0.001, 0.001));
  104. System.out.println(2.71828182845904523536 + "\t" + lb(2.71828182845904523536) + "\t" + ln(2.71828182845904523536) + "\t" + log(2.71828182845904523536) + "\t" + log(2.71828182845904523536, Math.PI) + "\t" + log(2.71828182845904523536, 2.71828182845904523536));
  105. System.out.println(2 + "\t" + lb(2) + "\t" + ln(2) + "\t" + log(2) + "\t" + log(2, Math.PI) + "\t" + log(2, 2));
  106. System.out.println(8 + "\t" + lb(8) + "\t" + ln(8) + "\t" + log(8) + "\t" + log(8, Math.PI) + "\t" + log(8, 8));
  107. System.out.println(1024 + "\t" + lb(1024) + "\t" + ln(1024) + "\t" + log(1024) + "\t" + log(1024, Math.PI) + "\t" + log(1024, 1024));
  108. System.out.println(11 + "\t" + lb(11) + "\t" + ln(11) + "\t" + log(11) + "\t" + log(11, Math.PI) + "\t" + log(11, 11));
  109. System.out.println(13 + "\t" + lb(13) + "\t" + ln(13) + "\t" + log(13) + "\t" + log(13, Math.PI) + "\t" + log(13, 13));
  110. System.out.println(2.13 + "\t" + lb(2.13) + "\t" + ln(2.13) + "\t" + log(2.13) + "\t" + log(2.13, Math.PI) + "\t" + log(2.13, 2.13));
  111. System.out.println(1.212121212 + "\t" + lb(1.212121212) + "\t" + ln(1.212121212) + "\t" + log(1.212121212) + "\t" + log(1.212121212, Math.PI) + "\t" + log(1.212121212, 1.212121212));
  112. System.out.println(1.001 + "\t" + lb(1.001) + "\t" + ln(1.001) + "\t" + log(1.001) + "\t" + log(1.001, Math.PI) + "\t" + log(1.001, 1.001));
  113. System.out.println(694 + "\t" + lb(694) + "\t" + ln(694) + "\t" + log(694) + "\t" + log(694, Math.PI) + "\t" + log(694, 694));
  114. System.out.println(1.6180339887 + "\t" + lb(1.6180339887) + "\t" + ln(1.6180339887) + "\t" + log(1.6180339887) + "\t" + log(1.6180339887, Math.PI) + "\t" + log(1.6180339887, 1.6180339887));
  115. System.out.println(2.4142135623 + "\t" + lb(2.4142135623) + "\t" + ln(2.4142135623) + "\t" + log(2.4142135623) + "\t" + log(2.4142135623, Math.PI) + "\t" + log(2.4142135623, 2.4142135623));
  116. System.out.println(1.4142135623 + "\t" + lb(1.4142135623) + "\t" + ln(1.4142135623) + "\t" + log(1.4142135623) + "\t" + log(1.4142135623, Math.PI) + "\t" + log(1.4142135623, 1.4142135623));
  117. System.out.println(17.1085 + "\t" + lb(17.1085) + "\t" + ln(17.1085) + "\t" + log(17.1085) + "\t" + log(17.1085, Math.PI) + "\t" + log(17.1085, 17.1085));
  118. System.out.println(27.0684 + "\t" + lb(27.0684) + "\t" + ln(27.0684) + "\t" + log(27.0684) + "\t" + log(27.0684, Math.PI) + "\t" + log(27.0684, 27.0684));
  119. System.out.println(17.1008 + "\t" + lb(17.1008) + "\t" + ln(17.1008) + "\t" + log(17.1008) + "\t" + log(17.1008, Math.PI) + "\t" + log(17.1008, 17.1008));
  120. System.out.println(10.1112 + "\t" + lb(10.1112) + "\t" + ln(10.1112) + "\t" + log(10.1112) + "\t" + log(10.1112, Math.PI) + "\t" + log(10.1112, 10.1112));
  121. }
  122. }
Success #stdin #stdout 0.06s 213440KB
stdin
Standard input is empty
stdout
4.5	2.169925001442312	1.504077396776274	0.6532125137753436	0.7610844284362812	1.0
1.125	0.16992500144231237	0.11778303565638347	0.0511525224473813	9.718970813326626	1.0
1.28289	0.35939747342219386	0.24911534540296157	0.10818941986592882	4.595180132310674	1.0
1.6	0.6780719051126378	0.4700036292457357	0.20411998265592485	2.4355766947724824	1.0
1.999999	0.9999992786522993	0.6931466805598204	0.301029778516686	1.6514973207761137	1.0
0.999999	-1.4426957622795542E-6	-1.0000005000298542E-6	-4.342946990634583E-7	-1144729.3134505686	1.0
9.999999	3.3219279506178507	2.3025849929940403	0.9999999565705496	0.49714989428508055	1.0
0.3	-1.736965594166206	-1.203972804325936	-0.5228787452803376	-0.9507938067507231	1.0
0.9	-0.15200309344504992	-0.10536051565782625	-0.04575749056067511	-10.86488499702373	1.0
0.8	-0.3219280948873622	-0.22314355131420965	-0.09691001300805636	-5.130015539806032	1.0
1.4	0.48542682717024166	0.33647223662121284	0.146128035678238	3.402152573848438	1.0
10	3.321928094887362	2.3025850929940455	1.0	0.49714987269413385	1.0
100	6.643856189774724	4.605170185988091	2.0	0.24857493634706693	1.0
1	0.0	0.0	0.0	Infinity	NaN
1000	9.965784284662087	6.907755278982137	3.0	0.16571662423137795	1.0
0.1	-3.3219280948873626	-2.302585092994046	-1.0000000000000002	-0.4971498726941338	1.0
0.01	-6.643856189774725	-4.605170185988092	-2.0000000000000004	-0.2485749363470669	1.0
0.0010	-9.965784284662089	-6.907755278982139	-3.000000000000001	-0.16571662423137792	1.0
2.718281828459045	1.4426950408889634	1.0	0.4342944819032518	1.1447298858494002	1.0
2	1.0	0.6931471805599453	0.3010299956639812	1.6514961294723187	1.0
8	3.0	2.0794415416798357	0.9030899869919436	0.5504987098241062	1.0
1024	10.0	6.931471805599453	3.010299956639812	0.16514961294723188	1.0
11	3.4594316186372973	2.3978952727983707	1.0413926851582251	0.47738944183057985	1.0
13	3.7004397181410917	2.5649493574615363	1.1139433523068367	0.44629726607246134	1.0
2.13	1.0908534304511135	0.7561219797213338	0.32837960343873773	1.5139486968376275	1.0
1.212121212	0.2775339753846394	0.19237189254745607	0.08354605140664548	5.950608847740101	1.0
1.001	0.0014419741739062826	9.99500333083396E-4	4.3407747931858113E-4	1145.3021554459917	1.0
694	9.43879185257826	6.542471960506805	2.841359470454855	0.17496901672020693	1.0
1.6180339887	0.6942419135861293	0.48121182502876675	0.20898764023658653	2.3788482042829444	1.0
2.4142135623	1.2715533031199315	0.881373586989266	0.38277568532471395	1.2988021228997204	1.0
1.4142135623	0.49999999992543287	0.34657359022828665	0.15051499780954367	3.302992259437227	1.0
17.1085	4.0966413709376255	2.839575416030644	1.2332119341302394	0.4031341725903456	1.0
27.0684	4.758537707956099	3.2983669958579545	1.4324625855929154	0.34705958654295804	1.0
17.1008	4.095991912924603	2.839125246040026	1.2330164277873954	0.40319809330217266	1.0
10.1112	3.337882321733961	2.3136437203507794	1.0048027008384537	0.49477362300010647	1.0