コンテンツにスキップ

Go/float64

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goのfloat64について

[編集]

Goにおけるfloat64は64ビット浮動小数点型を表す事前宣言された型です。IEEE 754標準に準拠した倍精度浮動小数点数で、8バイトのサイズを持ち、約1.8×10^308から約5.0×10^-324までの値を表現できます。

基本情報

[編集]
  • float64は64ビット(8バイト)の倍精度浮動小数点型
  • IEEE 754標準に準拠
  • 値の範囲: 約±1.8×10^308(最大値)、約±5.0×10^-324(最小値)
  • 精度: 約15〜17桁の有効数字
  • メモリ上での表現: 1ビット(符号)+ 11ビット(指数)+ 52ビット(仮数)
  • 高精度な科学技術計算、金融計算、統計処理などで使用される

他のキーワードとの組み合わせ

[編集]

変数宣言との組み合わせ

[編集]
var distance float64 = 12345678.901234 // 距離
var gravity float64 = 9.80665         // 重力加速度
mass := float64(70.5)                 // 質量 (kg)
pi := 3.141592653589793               // float64リテラル

// 特殊値
var infinity float64 = 1.0 / 0.0     // +Inf
var negInfinity float64 = -1.0 / 0.0 // -Inf
var notANumber float64 = 0.0 / 0.0   // NaN

定数定義との組み合わせ

[編集]
const PLANCK_CONSTANT float64 = 6.62607015e-34 // J·s
const ELEMENTARY_CHARGE float64 = 1.602176634e-19 // C
const EARTH_RADIUS float64 = 6371e3 // 地球の半径 (m)
const PI float64 = 3.141592653589793
const E float64 = 2.718281828459045

// 物理定数
const BOLTZMANN_CONSTANT float64 = 1.380649e-23
const AVOGADRO_NUMBER float64 = 6.02214076e23

関数パラメータと戻り値

[編集]
func calculateHypotenuse(a, b float64) float64 {
    return math.Hypot(a, b)
}

func fahrenheitToCelsius(f float64) float64 {
    return (f - 32.0) * 5.0 / 9.0
}

func calculateCircleArea(radius float64) float64 {
    return PI * radius * radius
}

型変換

[編集]
i := 1000
f := float64(i) // int から float64 への変換

f32 := float32(3.1415927)
f64 := float64(f32) // float32 から float64 への変換(精度は保たれるが元が低精度)

s := "2.71828"
f, err := strconv.ParseFloat(s, 64) // 文字列から float64 への変換
if err == nil {
    value := f
}

// 逆変換
value := float64(123.456789)
iValue := int(value) // 小数点以下切り捨て
sValue := strconv.FormatFloat(value, 'f', 6, 64) // 文字列化

配列とスライス

[編集]
var coordinates [3]float64         // 3次元座標
var matrix [4][4]float64           // 4x4行列
var samples []float64              // データサンプル
voltages := []float64{3.3, 5.0, 12.0, -12.0} // 電圧値の記録

// 科学データの例
spectra := []float64{
    1.23e-9, 2.45e-9, 3.67e-9,
}

マップ

[編集]
exchangeRates := make(map[string]float64)
exchangeRates["USD"] = 150.25
exchangeRates["EUR"] = 160.10

measurement := make(map[int]float64)
measurement[100] = 0.123456789
measurement[101] = 9876.54321

構造体のフィールド

[編集]
type Point struct {
    X, Y float64
}

type ComplexNumber struct {
    Real, Imag float64
}

type Measurement struct {
    Time     float64 // 時間 (秒)
    Voltage  float64 // 電圧 (V)
    Current  float64 // 電流 (A)
    Power    float64 // 電力 (W)
}

type Particle struct {
    Mass   float64
    Charge float64
    Pos    Point
    Vel    Point
}

スライスとバイナリ処理

[編集]
import (
    "encoding/binary"
    "bytes"
    "math"
)

// float64をバイト列に変換
func Float64ToBytes(f float64) []byte {
    buf := new(bytes.Buffer)
    binary.Write(buf, binary.LittleEndian, f)
    return buf.Bytes()
}

// バイト列からfloat64に変換
func BytesToFloat64(b []byte) float64 {
    return math.Float64frombits(binary.LittleEndian.Uint64(b))
}

// float64スライスをバイト列に変換
func Float64SliceToBytes(floats []float64) []byte {
    const sizeOfFloat64 = 8
    byteSlice := make([]byte, len(floats)*sizeOfFloat64)

    for i, f := range floats {
        binary.LittleEndian.PutUint64(
            byteSlice[i*sizeOfFloat64:], 
            math.Float64bits(f),
        )
    }
    return byteSlice
}

一般的なユースケース

[編集]
  1. 高精度な科学技術計算
       func kineticEnergy(mass, velocity float64) float64 {
           return 0.5 * mass * velocity * velocity
       }
    
  2. 金融計算や統計処理
       func mean(data []float64) float64 {
           sum := 0.0
           for _, v := range data {
               sum += v
           }
           return sum / float64(len(data))
       }
    
  3. 天文学や物理シミュレーション
       func gravitationalForce(m1, m2, distance float64) float64 {
           const G = 6.67430e-11 // 万有引力定数
           return G * m1 * m2 / (distance * distance)
       }
    


float64型は、精度と信頼性が求められる場面において非常に重要な役割を果たします。科学技術計算、金融処理、シミュレーション、統計解析など、微小な誤差が結果に大きな影響を及ぼす分野では、float32ではなくfloat64の使用が推奨されます。ただし、その分メモリ使用量や計算コストが高くなるため、用途に応じて適切に選択することが重要です。また、浮動小数点数に特有の丸め誤差や比較の落とし穴を理解した上で使うことが、正確で堅牢なプログラムを実現する鍵となります。