小编典典

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

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.

阅读 320

收藏
2020-07-02

共1个答案

小编典典

使用java /scala将会得到完全相同的结果,该math/#Nextafter函数“返回朝Y X后的下一个表示值。”

Float64frombits(Float64bits(x) + 1)

本主题所述

float64
不能表示所有16位数字
例如,如果x = 0.12345678901234567,使用math.Nextafter,您可以看到附近的float64值为…
1234565,… 1234566和… 1234568

或者这个线程:

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

golang问题4398说明:

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

规范说,如果“
可由type的值表示”,则x可以将常量值转换为type 。 该值不能用表示;最接近的近似值为1。T``x``T
1.00000000000000000001``float64

2020-07-02