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を計算する前の角度の加減乗除では誤差が生じないようだ。
#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を計算する前の角度の加減乗除では誤差が生じないようだ。