2014-09-13 89 views
1

這是從這裏取:http://tour.golang.org/#5爲什麼math.Nextafter(2,3)在Go中增加了0.0000000000000004而不是0.0000000000000001?

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. 
+2

我猜是因爲「2.0000000000000001」不能表示爲64位浮點數。 https://golang.org/src/pkg/math/nextafter.go – david 2014-09-13 09:04:15

回答

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.123456789,使用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.

相關問題