概要
以下、自分用のメモです。忘れないうちにメモメモ。。。
浮動小数点は計算する順序によって答えが変わってしまうのをすっかり忘れてて、思いっきりハマったのでついでにここにメモメモ。
試してみる
package floatop import ( "math/rand" "github.com/devlights/gomy/output" ) // OrderOfComputation -- 浮動小数点は計算の順序によって結果が変わることのサンプルです. // // # REFERENCES // - https://zenn.dev/kumackey/articles/d20230708-a7c195db087338 func OrderOfComputation() error { // // 浮動小数点は計算の順序によって結果が変わる // ただし、float32の場合は計算結果をfloat64で受ければ大丈夫 // var ( m = make(map[int]float32) ) for i := 0; i < 1000; i++ { v := rand.Float32() m[i] = v } for i := 0; i < 10; i++ { var ( total32 float32 total64 float64 ) for _, v := range m { total32 += v total64 += float64(v) } output.Stdoutf("[Total (float32, float64)]", "%v\t%v\n", total32, total64) } return nil }
実行すると以下のようになります。
gitpod /workspace/try-golang (master) $ task task: [run] go run . -onetime ENTER EXAMPLE NAME: floatop_order_of_computation [Name] "floatop_order_of_computation" [Total (float32, float64)] 496.12216 496.12240921816556 [Total (float32, float64)] 496.12225 496.12240921816556 [Total (float32, float64)] 496.1222 496.12240921816556 [Total (float32, float64)] 496.12213 496.12240921816556 [Total (float32, float64)] 496.12283 496.12240921816556 [Total (float32, float64)] 496.12213 496.12240921816556 [Total (float32, float64)] 496.1223 496.12240921816556 [Total (float32, float64)] 496.12286 496.12240921816556 [Total (float32, float64)] 496.12283 496.12240921816556 [Total (float32, float64)] 496.12213 496.12240921816556 [Elapsed] 639.289µs
参考情報
Goのおすすめ書籍
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。