2000,
Inf(1),
NaN(),
+ // smallest float64 that overflows Exp(x)
+ 7.097827128933841e+02,
+ // Issue 18912
+ 1.48852223e+09,
+ 1.4885222e+09,
}
var expSC = []float64{
0,
Inf(1),
Inf(1),
NaN(),
+ Inf(1),
+ Inf(1),
+ Inf(1),
+}
+
+var vfexp2SC = []float64{
+ Inf(-1),
+ -2000,
+ 2000,
+ Inf(1),
+ NaN(),
+ // smallest float64 that overflows Exp2(x)
+ 1024,
+}
+var exp2SC = []float64{
+ 0,
+ 0,
+ Inf(1),
+ Inf(1),
+ NaN(),
+ Inf(1),
}
var vfexpm1SC = []float64{
t.Errorf("%s(%g) = %g, want %g", name, vf[i], f, exp2[i])
}
}
- for i := 0; i < len(vfexpSC); i++ {
- if f := Exp2(vfexpSC[i]); !alike(expSC[i], f) {
+ for i := 0; i < len(vfexp2SC); i++ {
+ if f := Exp2(vfexp2SC[i]); !alike(exp2SC[i], f) {
t.Errorf("%s(%g) = %g, want %g", name, vfexpSC[i], f, expSC[i])
}
}
#define T7 2.4801587301587301587e-5
#define PosInf 0x7FF0000000000000
#define NegInf 0xFFF0000000000000
+#define Overflow 7.09782712893384e+02
// func Exp(x float64) float64
TEXT ·Exp(SB),NOSPLIT,$0
-// test bits for not-finite
+ // test bits for not-finite
MOVQ x+0(FP), BX
MOVQ $~(1<<63), AX // sign bit mask
MOVQ BX, DX
MOVQ $PosInf, AX
CMPQ AX, DX
JLE notFinite
+ // check if argument will overflow
MOVQ BX, X0
+ MOVSD $Overflow, X1
+ COMISD X1, X0
+ JA overflow
MOVSD $LOG2E, X1
MULSD X0, X1
CVTSD2SL X1, BX // BX = exponent