いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-329 (浮動小数点の計算順序)(Goに限った話ではない)

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

浮動小数点は計算する順序によって答えが変わってしまうのをすっかり忘れてて、思いっきりハマったのでついでにここにメモメモ。

試してみる

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

参考情報

wp.jmuk.org

zenn.dev

www.jpcert.or.jp

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。