- The Go Programming Language

2 min read Original article ↗

Source file src/math/log.go

     1  
     2  
     3  
     4  
     5  package math
     6  
     7  
    10  
    11  
    12  
    13  
    14  
    15  
    16  
    17  
    18  
    19  
    20  
    21  
    22  
    23  
    24  
    25  
    26  
    27  
    28  
    29  
    30  
    31  
    32  
    33  
    34  
    35  
    36  
    37  
    38  
    39  
    40  
    41  
    42  
    43  
    44  
    45  
    46  
    47  
    48  
    49  
    50  
    51  
    52  
    53  
    54  
    55  
    56  
    57  
    58  
    59  
    60  
    61  
    62  
    63  
    64  
    65  
    66  
    67  
    68  
    69  
    70  
    71  
    72  
    73  
    74  
    75  
    76  
    77  
    78  
    79  
    80  
    81  func Log(x float64) float64 {
    82  	if haveArchLog {
    83  		return archLog(x)
    84  	}
    85  	return log(x)
    86  }
    87  
    88  func log(x float64) float64 {
    89  	const (
    90  		Ln2Hi = 6.93147180369123816490e-01 
    91  		Ln2Lo = 1.90821492927058770002e-10 
    92  		L1    = 6.666666666666735130e-01   
    93  		L2    = 3.999999999940941908e-01   
    94  		L3    = 2.857142874366239149e-01   
    95  		L4    = 2.222219843214978396e-01   
    96  		L5    = 1.818357216161805012e-01   
    97  		L6    = 1.531383769920937332e-01   
    98  		L7    = 1.479819860511658591e-01   
    99  	)
   100  
   101  	
   102  	switch {
   103  	case IsNaN(x) || IsInf(x, 1):
   104  		return x
   105  	case x < 0:
   106  		return NaN()
   107  	case x == 0:
   108  		return Inf(-1)
   109  	}
   110  
   111  	
   112  	f1, ki := Frexp(x)
   113  	if f1 < Sqrt2/2 {
   114  		f1 *= 2
   115  		ki--
   116  	}
   117  	f := f1 - 1
   118  	k := float64(ki)
   119  
   120  	
   121  	s := f / (2 + f)
   122  	s2 := s * s
   123  	s4 := s2 * s2
   124  	t1 := s2 * (L1 + s4*(L3+s4*(L5+s4*L7)))
   125  	t2 := s4 * (L2 + s4*(L4+s4*L6))
   126  	R := t1 + t2
   127  	hfsq := 0.5 * f * f
   128  	return k*Ln2Hi - ((hfsq - (s*(hfsq+R) + k*Ln2Lo)) - f)
   129  }
   130  

View as plain text