山口屋~活動日誌~

私生活で主な出来事をピックアップ

C言語 三角関数 誤差 精度向上 fmod math.h 円周率 M_PI

2020-08-30 13:16:38 | ソフトウェア開発
C言語でmath.hに定義される定数の使い方→数値演算定数

#define _USE_MATH_DEFINES // for C++
#include <cmath>

#define _USE_MATH_DEFINES // for C
#include <math.h>

また、三角関数のsinを計算する際、fmod()で引数の剰余を求め範囲を-2π<θ<2πとすることで精度向上をすることができる。
使用例
sin(fmod(x,2.0*M_PI))

これだけでは、θ=0.5π、π、1.5πなどで本来、-1、0、+1になるはずのところでわずかに一致しないことがあり、sinとcosの変換等を利用して、-0.25π≦θ≦0.25πあるいは0≦θ≦0.25πでの計算に帰着させると、有効桁末尾の数桁分が精度向上し、本来の-1、0、+1に一致するようになる。

なお、Visual Studio 2017 のライブラリ関数では、-θとθでの値の絶対値が一致していたで、-0.25π≦θ≦0.25πへの帰着で良さそう。
マクローリン展開で自力で計算する場合は、まだ確認していないので、わからない。

πなど2進数で表しきれない数値を扱った時点で丸め誤差が発生し、sinやcosを計算する前の角度の加減乗除の際に誤差が伝搬するが、象限三角関数を用いると、45°単位で取り扱う限りはsinやcosを計算する前の角度の加減乗除では誤差が生じないようだ。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする