2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Qiita×Findy記事投稿キャンペーン 「自分のエンジニアとしてのキャリアを振り返ろう!」

[Swift] 浮動小数点数の2乗の和(とか)

Last updated at Posted at 2024-02-14

はじめ

浮動小数点数の配列の要素をすべて2乗して足し合わせるとき通常は

let array: [Double] = [0.0, 1.2, 1.3, 1.5, 1.6, 1.9, 2.4, 4.7]
let s0 = array.reduce(0.0) { r, e in r + e * e }

としますね。

ですが、Swiftには浮動小数点数に二つの浮動小数点数を掛けたものを加える、というちょっと変わった関数が備わっています。
これを使うと次のようになります。

let array: [Double] = [0.0, 1.2, 1.3, 1.5, 1.6, 1.9, 2.4, 4.7]
let s1 = array.reduce(0.0) { r, e in r.addingProduct(e, e) }

Appleのドキュメント addingProduct(::)

mutableなaddProductもあります。
Appleのドキュメント addProduct(::)

なにがうれしいのか

精度がいい

先の二つの計算結果を見てみると以下のようになっています

s0 = 39.400000000000006
s1 = 39.4

普通に2乗して足し合したものには浮動小数点数でおなじみのゴミがついていますが、addingProductを使った場合はそれがありません。

速い?

実はこのaddingproductはfma(fused multiply-add)という演算で最近のCPUにはほとんど実装されている演算です。
なのでたいていの場合は速いです。
精度が高いのもこのおかげですね。

おわり

この二つの数を掛け合わせたものを足すというfmaはやみくもに作られたものではなく、いろいろな分野で現れる計算なので知っておくといいかもしれません。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?