1

XC16 コンパイラの DSP ルーチン ヘッダー (dsp.h) には、次の行があります。

/* Some constants. */
#ifndef PI                              /* [ */
#define PI 3.1415926535897931159979634685441851615905761718750 /* double */
#endif  /* ] */
#ifndef SIN_PI_Q                                /* [ */
#define SIN_PI_Q 0.7071067811865474617150084668537601828575134277343750
                                                /* sin(PI/4), (double) */
#endif  /* ] */

しかし、PI の値は実際には (同じ小数点以下の桁数まで) 次のとおりです。

3.1415926535897932384626433832795028841971693993751

dsp.h で定義された値は、小数点第 16 位から発散し始めます。二重浮動小数点演算の場合、これは重要な境界線です。Q15 表現の場合、これは重要ではありません。sin(pi/4) の値も小数点以下 16 位で正しい値から外れています。

Microchip 社が間違った値を使用しているのはなぜですか? 三角関数値の計算に関連する難解な理由がありますか、それとも単に間違いですか? それとも関係ないのでしょうか?

4

2 に答える 2

0

このような値は、マシン番号への丸めを強制するために微調整されることがあります。17 (コンマの前を含む) 重要な場所は double が不正確になる場所です (そして、制限された精度で値を計算するためのコンパイラの操作は、それをさらに悪化させる可能性があります)

そのため、ライブラリ プログラマは値を操作して、ソースの 10 進数表現から最も近い 2 進数に丸められるようにした可能性があります。

テストは数値を 2 進数で書き出すことであり、おそらく最初の 52 桁の後に残りの桁はゼロになるでしょう。

IOW これは、16 ~ 19 桁の 10 進数の pi 数を 10 進数に変換した最適なバイナリ表現であり、追加の桁数を生成できます。

于 2015-07-05T12:08:25.810 に答える