3

この質問のフォローアップとして:

Apple の複素数サポートを使用して電卓アプリを実装している最中に、そのサポートを使用して計算すると次のようになることに気付きました。

(1+i)^2=1.2246063538223773e-16 + 2i

もちろん、正しい単位は (1+i)^2=2i です。これは、より一般的な現象の具体的な例です。丸め誤差は、ゼロであるはずの部分をわずかにゼロ以外の値に丸める場合、非常に厄介です。

これに対処する方法についての提案はありますか? 他の方法で複素数の整数べき乗を実装することもできますが、一般的な問題は残り、私のソリューション自体が他の矛盾を引き起こす可能性があります。

4

1 に答える 1

3

お気づきのように、これは浮動小数点の標準的な丸め誤差の問題です。@Howard は、表示する前に double の結果を float 範囲に丸める必要があることに注意してください。

私は通常FLT_EPSILON、これらの種類のことも手伝ってくれます。

#define fequal(a,b) (fabs((a) - (b)) < FLT_EPSILON)
#define fequalzero(a) (fabs(a) < FLT_EPSILON)

それらを使用すると、このような関数が好きになる場合があります(テストされていません)

inline void froundzero(a) { if (fequalzero(a)) a = 0; }

彼らが言うように、複雑なバージョンは読者の演習として残されています:D

于 2011-04-16T14:00:00.677 に答える