2016-09-22 2 views
5

Goでfloat32の数値をfloat64の精度に変換している間に失われています。たとえば、359.9からfloat64に変換すると、359.8999938964844が生成されます。 float32が正確に格納できる場合、なぜfloat64の精度が低下するのですか?float32をfloat64に変換する際に精度が低下するのはなぜですか?

サンプルコード:double(のfloat64)にfloat(すなわちのfloat32)から変換するとき

package main 

import (
    "fmt" 
) 

func main() { 
    var a float32 = 359.9 
    fmt.Println(a) 
    fmt.Println(float64(a)) 
} 

はあなた決して失う精度Playground

+2

https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Mysticial

答えて

6

上でそれを試してみてください。前者のは、後者のサブセットであるでなければなりません。

出力フォーマッタのデフォルト精度と関連があります。

float 359.9に最も近いIEEE754が

359.899993896484375 

359.9からdouble

359.8999999999999772626324556767940521240234375 

359.899993896484375からdouble

359.899993896484375 

最も近いIEEE754最も近いIEEE754である(すなわち、あります同じ;サブセット化のためにru私はすでに言及している)。

したがって、float64(a)float64(359.899993896484375)と同じであることがわかります。これは359.899993896484375です。これは出力を説明していますが、フォーマッタは最後の2桁を四捨五入しています。

+0

私が話しています特にここでゴランについて。 golangは359.9を正確に保存できますが、float64値に変更した後は359.8999938964844に変更されます。 –

+0

私はそれを説明する最後に新しい文を入れました。 –

+1

@MayankPatel:さまざまな浮動小数点形式の動詞の出力を見てください。https://play.golang.org/p/9CDBLy7DMQ – JimB

3

これは私がFaceyMcFaceFaceの答え@理解して助けた:

var a float32 = math.Pi 
fmt.Println(a) 
fmt.Println(float64(a)) 
fmt.Println(float64(math.Pi)) 

3.1415927 
3.1415927410125732 
3.141592653589793 

https://play.golang.org/p/-bAQLqjlLG

関連する問題