为什么Go中的math.Nextafter(2,3)增加0.0000000000000004而不是0.0000000000000001?

时间:2014-09-13 08:56:41

标签: go

这是从这里取的:http://tour.golang.org/#5

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Printf("Now you have %g problems.",
        math.Nextafter(2, 3))
}

结果:

//Now you have 2.0000000000000004 problems.
//Program exited.

1 个答案:

答案 0 :(得分:8)

你会得到very same result with java/scala math/#Nextafter函数"将x后面的下一个可表示值返回y。"

Float64frombits(Float64bits(x) + 1)

正如this thread

中所述
  

float64 cannot express all 16 digit numbers
  例如,如果x = 0.12345678901234567,使用math.Nextafter,您可以看到附近的float64值为... 1234565,... 1234566和... 1234568

另见" Why can't decimal numbers be represented exactly in binary?"。
或者这个帖子:

  

在基数10中可准确表示的某些数字在基数2中并不完全可表示   例如,数字0.1(基数10)不能在基数2中准确表示   就像0.1(基数3)不能在基数10中精确表示为十进制值:它是0.33333(永远重复)。

golang issue 4398说明了:

const x1 = 1 - float64(1.00000000000000000001) // 0!
  

The spec says如果" x可以通过类型T的值表示,则可以将常量值x转换为T类型。 "
  值1.00000000000000000001float64中无法表示;最接近的近似值是1.