亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么這兩個大浮點值不相等?

為什么這兩個大浮點值不相等?

Go
藍山帝景 2022-09-26 19:48:07
在過去的2周里,我一直在研究浮點的行為和功能,特別是GO中的大浮點。我遇到了許多行為,并自己找到了答案。但是,仍然有一個答案我找不到自己。https://play.golang.org/p/-y0oeb2Jisvvalue1 := big.NewFloat(137216723432.8234782347)value2 := big.NewFloat(71371.92602458)for i := 0; i < 300; i++ {    value1.Sub(value1, value2)}value3 := big.NewFloat(137216723432.8234782347)value4 := big.NewFloat(71371.92602458)for i := 0; i < 300; i++ {    result := big.NewFloat(0).Sub(value3,value4)    value3.Set(result)}encodedValue1, _ := value1.GobEncode()encodedValue3, _ := value3.GobEncode()if value1 == value3 {    fmt.Println("values are equal" , value1 , value3)} else {    fmt.Println("values are not equal", value1 ,value3)}fmt.Println("difference is here:\n", encodedValue1,"\n", encodedValue3)為什么這兩個操作的結果不相等?根據我的理解,這與精度/準確性/舍入模式有關。
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

value1和 是指針,因此比較這些指針,而不是指向的值。可能有 2 個指向的對象相等,但它們的地址不相等。value3value1 == value3

比較大。浮點值(或 ),請使用浮點值。如果 2 個值(它們表示的數字)相等,則返回。*big.Float0

if value1.Cmp(value3) == 0 {

    fmt.Println("values are equal", value1, value3)

} else {

    fmt.Println("values are not equal", value1, value3)

}

有了這個變化,輸出將是(在Go Playground上嘗試):

values are equal 1.3719531185501585e+11 1.3719531185501585e+11

difference is here:

 [1 2 0 0 0 53 0 0 0 37 255 139 210 151 120 32 120 0] 

 [1 10 0 0 0 53 0 0 0 37 255 139 210 151 120 32 120 0]

因此,表示的數字是相等的。

Float.GobEncode() 返回的序列化二進制形式是不一樣的,但這并不意味著表示的數字不相等。正如其文檔所述:

戈布代碼實現了這個貪婪。Gob編碼器接口。將封送處理 Float 值及其所有屬性(精度、舍入模式、準確性)。

輸出是不同的,因為 的內部結構不相同(在本例中為精度)。在這種情況下,即使您可以比較指向的對象,這些對象也不會相同,但表示的數字是相同的。同樣,始終使用提供的方法比較復雜對象,當然不是地址。big.Float

此示例中的差異來自存儲的精度字段:

fmt.Println(value1.Acc())
fmt.Println(value3.Acc())

哪些輸出(在Go游樂場上嘗試):

Below
Exact

返回的精度是“最近操作產生的x的精度”。由于在 和 上執行的最后一個操作不相同( 和 ),因此精度字段不一定相同(并且在此示例中它們確實不同)。由于準確性屬性也包含在 Gob 序列化表單中,因此它們的序列化表單不同。Float.Acc()value1value3value1.Sub()value3.Set()


查看完整回答
反對 回復 2022-09-26
  • 1 回答
  • 0 關注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號