mirror of https://github.com/golang/go.git
math: Modf(-0) returns -0,-0
Fixes #12867 Change-Id: I8ba81c622bce2a77a6142f941603198582eaf8a4 Reviewed-on: https://go-review.googlesource.com/15570 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
821b54921a
commit
6fed2a68f7
|
|
@ -447,7 +447,7 @@ var log2 = []float64{
|
||||||
var modf = [][2]float64{
|
var modf = [][2]float64{
|
||||||
{4.0000000000000000e+00, 9.7901192488367350108546816e-01},
|
{4.0000000000000000e+00, 9.7901192488367350108546816e-01},
|
||||||
{7.0000000000000000e+00, 7.3887247457810456552351752e-01},
|
{7.0000000000000000e+00, 7.3887247457810456552351752e-01},
|
||||||
{0.0000000000000000e+00, -2.7688005719200159404635997e-01},
|
{Copysign(0, -1), -2.7688005719200159404635997e-01},
|
||||||
{-5.0000000000000000e+00, -1.060361827107492160848778e-02},
|
{-5.0000000000000000e+00, -1.060361827107492160848778e-02},
|
||||||
{9.0000000000000000e+00, 6.3629370719841737980004837e-01},
|
{9.0000000000000000e+00, 6.3629370719841737980004837e-01},
|
||||||
{2.0000000000000000e+00, 9.2637723924396464525443662e-01},
|
{2.0000000000000000e+00, 9.2637723924396464525443662e-01},
|
||||||
|
|
@ -1356,11 +1356,13 @@ var log1pSC = []float64{
|
||||||
|
|
||||||
var vfmodfSC = []float64{
|
var vfmodfSC = []float64{
|
||||||
Inf(-1),
|
Inf(-1),
|
||||||
|
Copysign(0, -1),
|
||||||
Inf(1),
|
Inf(1),
|
||||||
NaN(),
|
NaN(),
|
||||||
}
|
}
|
||||||
var modfSC = [][2]float64{
|
var modfSC = [][2]float64{
|
||||||
{Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)},
|
{Inf(-1), NaN()}, // [2]float64{Copysign(0, -1), Inf(-1)},
|
||||||
|
{Copysign(0, -1), Copysign(0, -1)},
|
||||||
{Inf(1), NaN()}, // [2]float64{0, Inf(1)},
|
{Inf(1), NaN()}, // [2]float64{0, Inf(1)},
|
||||||
{NaN(), NaN()},
|
{NaN(), NaN()},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,12 @@ func Modf(f float64) (int float64, frac float64)
|
||||||
|
|
||||||
func modf(f float64) (int float64, frac float64) {
|
func modf(f float64) (int float64, frac float64) {
|
||||||
if f < 1 {
|
if f < 1 {
|
||||||
if f < 0 {
|
switch {
|
||||||
|
case f < 0:
|
||||||
int, frac = Modf(-f)
|
int, frac = Modf(-f)
|
||||||
return -int, -frac
|
return -int, -frac
|
||||||
|
case f == 0:
|
||||||
|
return f, f // Return -0, -0 when f == -0
|
||||||
}
|
}
|
||||||
return 0, f
|
return 0, f
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,19 @@
|
||||||
|
|
||||||
// func Modf(f float64) (int float64, frac float64)
|
// func Modf(f float64) (int float64, frac float64)
|
||||||
TEXT ·Modf(SB),NOSPLIT,$0
|
TEXT ·Modf(SB),NOSPLIT,$0
|
||||||
|
// special case for f == -0.0
|
||||||
|
MOVL f+4(FP), DX // high word
|
||||||
|
MOVL f+0(FP), AX // low word
|
||||||
|
CMPL DX, $(1<<31) // beginning of -0.0
|
||||||
|
JNE notNegativeZero
|
||||||
|
CMPL AX, $0 // could be denormalized
|
||||||
|
JNE notNegativeZero
|
||||||
|
MOVL AX, int+8(FP)
|
||||||
|
MOVL DX, int+12(FP)
|
||||||
|
MOVL AX, frac+16(FP)
|
||||||
|
MOVL DX, frac+20(FP)
|
||||||
|
RET
|
||||||
|
notNegativeZero:
|
||||||
FMOVD f+0(FP), F0 // F0=f
|
FMOVD f+0(FP), F0 // F0=f
|
||||||
FMOVD F0, F1 // F0=f, F1=f
|
FMOVD F0, F1 // F0=f, F1=f
|
||||||
FSTCW -2(SP) // save old Control Word
|
FSTCW -2(SP) // save old Control Word
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue