Go言語で浮動小数点数を扱う

Go言語で浮動小数点数を扱う方法

Go言語でのdoubleに相当する型はfloat64です。
Go言語では、浮動小数点数を扱う際に、float32とfloat64の2つの型が提供されています。
float64は、通常のプログラミングで言う「double」に相当し、64ビットの倍精度浮動小数点数です。
ここでは、float64を使った基本的な操作や注意点について説明します。

まず、float64型の変数を宣言する方法について説明します。
Goでは、float64型の変数は次のように宣言できます。

var x float64
x = 3.14159

このコードでは、xという変数がfloat64型として宣言され、値3.14159が代入されています。
Goでは型推論もサポートしており、変数を宣言する際に型を指定せずに代入することもできます。
この場合、コンパイラが自動的に型を推測します。

x := 3.14159

このように書くと、xは自動的にfloat64型として扱われます。

次に、float64型の変数に対する演算を見ていきます。
float64型は、加算、減算、乗算、除算といった基本的な算術演算が可能です。

var a float64 = 10.5
var b float64 = 2.3

sum := a + b
difference := a - b
product := a * b
quotient := a / b

これらの演算は、float64型の変数で行われ、結果もfloat64型として得られます。

float64型の変数に対する注意点として、浮動小数点数の精度に関する問題があります。
浮動小数点数は有限のビットで数値を表現するため、数値の精度が失われることがあります。
例えば、0.1という数値は、2進数で正確に表現することができず、わずかな誤差が生じることがあります。
このような精度の問題に注意しながら、比較や計算を行う必要があります。

浮動小数点数の比較には、直接の比較演算子(==、!=、<、> など)を使用することもできますが、精度の問題を避けるために、誤差範囲を設定して比較することが一般的です。
例えば、次のように小さな誤差を許容することで、比較を行います。

const epsilon = 1e-9

if abs(a-b) < epsilon {
  // a と b はほぼ等しいとみなす
}

func abs(x float64) float64 {
  if x < 0 {
    return -x
  }
  return x
}

ここでは、epsilonという小さな値を設定し、aとbの差がその範囲内に収まるかどうかで等しさを判断しています。

float64型の数値は、標準ライブラリのmathパッケージを使って多くの数学的な操作を行うことができます。
例えば、平方根や三角関数、対数などの関数があります。

import "math"

sqrt := math.Sqrt(16)       // 平方根
sinValue := math.Sin(math.Pi / 2)  // サイン
logValue := math.Log(10)    // 自然対数

このように、mathパッケージを使うことで、float64型の数値に対する複雑な数学的な計算が簡単に行えます。