$22 GRAYBYTE WORDPRESS FILE MANAGER $86

SERVER : vnpttt-amd7f72-h1.vietnix.vn #1 SMP Fri May 24 12:42:50 UTC 2024
SERVER IP : 103.200.23.149 | ADMIN IP 216.73.216.22
OPTIONS : CRL = ON | WGT = ON | SDO = OFF | PKEX = OFF
DEACTIVATED : NONE

/lib/golang/src/math/

HOME
Current File : /lib/golang/src/math//trig_reduce.go
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package math

import (
	"math/bits"
)

// reduceThreshold is the maximum value of x where the reduction using Pi/4
// in 3 float64 parts still gives accurate results. This threshold
// is set by y*C being representable as a float64 without error
// where y is given by y = floor(x * (4 / Pi)) and C is the leading partial
// terms of 4/Pi. Since the leading terms (PI4A and PI4B in sin.go) have 30
// and 32 trailing zero bits, y should have less than 30 significant bits.
//
//	y < 1<<30  -> floor(x*4/Pi) < 1<<30 -> x < (1<<30 - 1) * Pi/4
//
// So, conservatively we can take x < 1<<29.
// Above this threshold Payne-Hanek range reduction must be used.
const reduceThreshold = 1 << 29

// trigReduce implements Payne-Hanek range reduction by Pi/4
// for x > 0. It returns the integer part mod 8 (j) and
// the fractional part (z) of x / (Pi/4).
// The implementation is based on:
// "ARGUMENT REDUCTION FOR HUGE ARGUMENTS: Good to the Last Bit"
// K. C. Ng et al, March 24, 1992
// The simulated multi-precision calculation of x*B uses 64-bit integer arithmetic.
func trigReduce(x float64) (j uint64, z float64) {
	const PI4 = Pi / 4
	if x < PI4 {
		return 0, x
	}
	// Extract out the integer and exponent such that,
	// x = ix * 2 ** exp.
	ix := Float64bits(x)
	exp := int(ix>>shift&mask) - bias - shift
	ix &^= mask << shift
	ix |= 1 << shift
	// Use the exponent to extract the 3 appropriate uint64 digits from mPi4,
	// B ~ (z0, z1, z2), such that the product leading digit has the exponent -61.
	// Note, exp >= -53 since x >= PI4 and exp < 971 for maximum float64.
	digit, bitshift := uint(exp+61)/64, uint(exp+61)%64
	z0 := (mPi4[digit] << bitshift) | (mPi4[digit+1] >> (64 - bitshift))
	z1 := (mPi4[digit+1] << bitshift) | (mPi4[digit+2] >> (64 - bitshift))
	z2 := (mPi4[digit+2] << bitshift) | (mPi4[digit+3] >> (64 - bitshift))
	// Multiply mantissa by the digits and extract the upper two digits (hi, lo).
	z2hi, _ := bits.Mul64(z2, ix)
	z1hi, z1lo := bits.Mul64(z1, ix)
	z0lo := z0 * ix
	lo, c := bits.Add64(z1lo, z2hi, 0)
	hi, _ := bits.Add64(z0lo, z1hi, c)
	// The top 3 bits are j.
	j = hi >> 61
	// Extract the fraction and find its magnitude.
	hi = hi<<3 | lo>>61
	lz := uint(bits.LeadingZeros64(hi))
	e := uint64(bias - (lz + 1))
	// Clear implicit mantissa bit and shift into place.
	hi = (hi << (lz + 1)) | (lo >> (64 - (lz + 1)))
	hi >>= 64 - shift
	// Include the exponent and convert to a float.
	hi |= e << shift
	z = Float64frombits(hi)
	// Map zeros to origin.
	if j&1 == 1 {
		j++
		j &= 7
		z--
	}
	// Multiply the fractional part by pi/4.
	return j, z * PI4
}

// mPi4 is the binary digits of 4/pi as a uint64 array,
// that is, 4/pi = Sum mPi4[i]*2^(-64*i)
// 19 64-bit digits and the leading one bit give 1217 bits
// of precision to handle the largest possible float64 exponent.
var mPi4 = [...]uint64{
	0x0000000000000001,
	0x45f306dc9c882a53,
	0xf84eafa3ea69bb81,
	0xb6c52b3278872083,
	0xfca2c757bd778ac3,
	0x6e48dc74849ba5c0,
	0x0c925dd413a32439,
	0xfc3bd63962534e7d,
	0xd1046bea5d768909,
	0xd338e04d68befc82,
	0x7323ac7306a673e9,
	0x3908bf177bf25076,
	0x3ff12fffbc0b301f,
	0xde5e2316b414da3e,
	0xda6cfd9e4f96136e,
	0x9e8c7ecd3cbfd45a,
	0xea4f758fd7cbe2f6,
	0x7a0e73ef14a525d4,
	0xd7f6bf623f1aba10,
	0xac06608df8f6d757,
}

Current_dir [ NOT WRITEABLE ] Document_root [ WRITEABLE ]


[ Back ]
NAME
SIZE
LAST TOUCH
USER
CAN-I?
FUNCTIONS
..
--
16 Dec 2025 9.30 PM
root / root
0755
big
--
16 Dec 2025 9.34 PM
root / root
0755
bits
--
16 Dec 2025 9.30 PM
root / root
0755
cmplx
--
16 Dec 2025 9.30 PM
root / root
0755
rand
--
16 Dec 2025 9.30 PM
root / root
0755
abs.go
0.357 KB
4 Dec 2025 6.06 PM
root / root
0644
acos_s390x.s
3.69 KB
4 Dec 2025 6.06 PM
root / root
0644
acosh.go
1.708 KB
4 Dec 2025 6.06 PM
root / root
0644
acosh_s390x.s
4.319 KB
4 Dec 2025 6.06 PM
root / root
0644
arith_s390x.go
3.731 KB
4 Dec 2025 6.06 PM
root / root
0644
asin.go
1.089 KB
4 Dec 2025 6.06 PM
root / root
0644
asin_s390x.s
4.118 KB
4 Dec 2025 6.06 PM
root / root
0644
asinh.go
1.921 KB
4 Dec 2025 6.06 PM
root / root
0644
asinh_s390x.s
5.682 KB
4 Dec 2025 6.06 PM
root / root
0644
atan.go
3.026 KB
4 Dec 2025 6.06 PM
root / root
0644
atan2.go
1.523 KB
4 Dec 2025 6.06 PM
root / root
0644
atan2_s390x.s
6.875 KB
4 Dec 2025 6.06 PM
root / root
0644
atan_s390x.s
3.689 KB
4 Dec 2025 6.06 PM
root / root
0644
atanh.go
1.994 KB
4 Dec 2025 6.06 PM
root / root
0644
atanh_s390x.s
5.059 KB
4 Dec 2025 6.06 PM
root / root
0644
bits.go
1.87 KB
4 Dec 2025 6.06 PM
root / root
0644
cbrt.go
2.311 KB
4 Dec 2025 6.06 PM
root / root
0644
cbrt_s390x.s
4.886 KB
4 Dec 2025 6.06 PM
root / root
0644
const.go
2.762 KB
4 Dec 2025 6.06 PM
root / root
0644
copysign.go
0.387 KB
4 Dec 2025 6.06 PM
root / root
0644
cosh_s390x.s
5.594 KB
4 Dec 2025 6.06 PM
root / root
0644
dim.go
1.868 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_amd64.s
1.917 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_arm64.s
0.94 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_asm.go
0.347 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_loong64.s
1.195 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_noasm.go
0.412 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_riscv64.s
1.162 KB
4 Dec 2025 6.06 PM
root / root
0644
dim_s390x.s
1.969 KB
4 Dec 2025 6.06 PM
root / root
0644
erf.go
11.509 KB
4 Dec 2025 6.06 PM
root / root
0644
erf_s390x.s
8.495 KB
4 Dec 2025 6.06 PM
root / root
0644
erfc_s390x.s
14.361 KB
4 Dec 2025 6.06 PM
root / root
0644
erfinv.go
3.369 KB
4 Dec 2025 6.06 PM
root / root
0644
exp.go
5.376 KB
4 Dec 2025 6.06 PM
root / root
0644
exp2_asm.go
0.257 KB
4 Dec 2025 6.06 PM
root / root
0644
exp2_noasm.go
0.289 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_amd64.go
0.255 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_amd64.s
4.242 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_arm64.s
5.356 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_asm.go
0.272 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_loong64.s
5.338 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_noasm.go
0.307 KB
4 Dec 2025 6.06 PM
root / root
0644
exp_s390x.s
4.63 KB
4 Dec 2025 6.06 PM
root / root
0644
expm1.go
7.909 KB
4 Dec 2025 6.06 PM
root / root
0644
expm1_s390x.s
5.201 KB
4 Dec 2025 6.06 PM
root / root
0644
floor.go
3.291 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_386.s
1.474 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_amd64.s
1.999 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_arm64.s
0.56 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_asm.go
0.442 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_loong64.s
1.015 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_noasm.go
0.542 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_ppc64x.s
0.487 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_riscv64.s
1.731 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_s390x.s
0.565 KB
4 Dec 2025 6.06 PM
root / root
0644
floor_wasm.s
0.448 KB
4 Dec 2025 6.06 PM
root / root
0644
fma.go
4.86 KB
4 Dec 2025 6.06 PM
root / root
0644
frexp.go
0.907 KB
4 Dec 2025 6.06 PM
root / root
0644
gamma.go
5.525 KB
4 Dec 2025 6.06 PM
root / root
0644
hypot.go
0.83 KB
4 Dec 2025 6.06 PM
root / root
0644
hypot_386.s
1.813 KB
4 Dec 2025 6.06 PM
root / root
0644
hypot_amd64.s
1.055 KB
4 Dec 2025 6.06 PM
root / root
0644
hypot_asm.go
0.258 KB
4 Dec 2025 6.06 PM
root / root
0644
hypot_noasm.go
0.29 KB
4 Dec 2025 6.06 PM
root / root
0644
j0.go
13.604 KB
4 Dec 2025 6.06 PM
root / root
0644
j1.go
13.304 KB
4 Dec 2025 6.06 PM
root / root
0644
jn.go
7.179 KB
4 Dec 2025 6.06 PM
root / root
0644
ldexp.go
1.052 KB
4 Dec 2025 6.06 PM
root / root
0644
lgamma.go
11.025 KB
4 Dec 2025 6.06 PM
root / root
0644
log.go
3.86 KB
4 Dec 2025 6.06 PM
root / root
0644
log10.go
0.853 KB
4 Dec 2025 6.06 PM
root / root
0644
log10_s390x.s
4.731 KB
4 Dec 2025 6.06 PM
root / root
0644
log1p.go
6.345 KB
4 Dec 2025 6.06 PM
root / root
0644
log1p_s390x.s
5.106 KB
4 Dec 2025 6.06 PM
root / root
0644
log_amd64.s
3.663 KB
4 Dec 2025 6.06 PM
root / root
0644
log_asm.go
0.253 KB
4 Dec 2025 6.06 PM
root / root
0644
log_s390x.s
4.292 KB
4 Dec 2025 6.06 PM
root / root
0644
log_stub.go
0.285 KB
4 Dec 2025 6.06 PM
root / root
0644
logb.go
0.997 KB
4 Dec 2025 6.06 PM
root / root
0644
mod.go
0.882 KB
4 Dec 2025 6.06 PM
root / root
0644
modf.go
0.892 KB
4 Dec 2025 6.06 PM
root / root
0644
modf_arm64.s
0.437 KB
4 Dec 2025 6.06 PM
root / root
0644
modf_asm.go
0.285 KB
4 Dec 2025 6.06 PM
root / root
0644
modf_noasm.go
0.318 KB
4 Dec 2025 6.06 PM
root / root
0644
modf_ppc64x.s
0.406 KB
4 Dec 2025 6.06 PM
root / root
0644
nextafter.go
1.21 KB
4 Dec 2025 6.06 PM
root / root
0644
pow.go
3.646 KB
4 Dec 2025 6.06 PM
root / root
0644
pow10.go
1.239 KB
4 Dec 2025 6.06 PM
root / root
0644
pow_s390x.s
16.216 KB
4 Dec 2025 6.06 PM
root / root
0644
remainder.go
2.043 KB
4 Dec 2025 6.06 PM
root / root
0644
signbit.go
0.295 KB
4 Dec 2025 6.06 PM
root / root
0644
sin.go
6.353 KB
4 Dec 2025 6.06 PM
root / root
0644
sin_s390x.s
8.572 KB
4 Dec 2025 6.06 PM
root / root
0644
sincos.go
1.758 KB
4 Dec 2025 6.06 PM
root / root
0644
sinh.go
1.692 KB
4 Dec 2025 6.06 PM
root / root
0644
sinh_s390x.s
5.978 KB
4 Dec 2025 6.06 PM
root / root
0644
sqrt.go
4.751 KB
4 Dec 2025 6.06 PM
root / root
0644
stubs.go
2.572 KB
4 Dec 2025 6.06 PM
root / root
0644
stubs_s390x.s
12.382 KB
4 Dec 2025 6.06 PM
root / root
0644
tan.go
3.68 KB
4 Dec 2025 6.06 PM
root / root
0644
tan_s390x.s
2.683 KB
4 Dec 2025 6.06 PM
root / root
0644
tanh.go
2.657 KB
4 Dec 2025 6.06 PM
root / root
0644
tanh_s390x.s
4.571 KB
4 Dec 2025 6.06 PM
root / root
0644
trig_reduce.go
3.339 KB
4 Dec 2025 6.06 PM
root / root
0644
unsafe.go
1.596 KB
4 Dec 2025 6.06 PM
root / root
0644

GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME
Static GIF