CQ出版社インターフェース誌の2017年8月号で解説している,固定小数点演算で sin 関数の値を求める二つの関数を比較するためのプログラムの全体.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SinCosFixed.hpp Source File

SinCosFixed.hpp

00001 //--------------------------------------------------------------
00002 //  ミニマックス近似式で sin 関数,cos 関数の値を求める
00003 //      (π/2)x に対する sin, cos を求める
00004 //      小数点以下のビット数: 14 ビット
00005 //      実際の数値と,引数および戻り値の対応関係
00006 //              0 → 0
00007 //          16384 → 1
00008 //  2017/03/04, Copyright (c) 2017 MIKAMI, Naoki
00009 //--------------------------------------------------------------
00010 
00011 #include "mbed.h"
00012 #include "FixedFloat.hpp"
00013 
00014 #ifndef SIN_FIXED_INT16T_HPP
00015 #define SIN_FIXED_INT16T_HPP
00016 
00017 const int32_t SIN_A1_ = ToFixed29( 0.57079101); // a1 - 1
00018 const int32_t SIN_A3_ = ToFixed29(-0.64589285); // a3
00019 const int32_t SIN_A5_ = ToFixed29( 0.07943434); // a5
00020 const int16_t SIN_A7_ = ToFixed15(-0.00433310); // a7
00021 
00022 inline int16_t Sin16(int16_t x)
00023 {
00024     if (abs(x) > 0x4000) x = 0x8000 - x;    // x ← 2 - x
00025 
00026     int16_t x2  = Round14(x*x);
00027     int32_t acc = Round14(Round14(Round14
00028                   (SIN_A7_*x2 + SIN_A5_)*x2
00029                               + SIN_A3_)*x2
00030                               + SIN_A1_)*x;
00031     return Round15(acc) + x;
00032 }
00033 
00034 inline int16_t Cos16(int16_t x) { return Sin16(16384 - x); }
00035 
00036 #endif  // SIN_FIXED_INT16T_HPP