2

Python での放射の sin と cos の計算について簡単な質問があります。

私の例では、「x.xe-90」のように、cosははるかに小さい値を計算できますが、sinは「x.xe-8」よりも大きな値に制限されているようです。

罪を適切に機能させる方法はありますか(罪の前のラウンドを除く)(もちろん、精度の制限内で)。

>>> import math
>>> math.sin(1.0e-8)
1e-08
>>> math.sin(1.0e-9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
>>> math.cos(1.0e-90)
1.0

編集:問題はOSでした。利用可能なアップデートがあります。( https://www.suse.com/support/update/announcement/2012/suse-ru-20120681-1.html )

4

3 に答える 3

0

コード(Python 2.7.5)を見ました。関連する行は次の場所にありModules/mathmodule.cます。

r = (*func)(x);
PyFPE_END_PROTECT(r);
if (Py_IS_NAN(r)) {
    if (!Py_IS_NAN(x))
        errno = EDOM;
    else
        errno = 0;
}
else if (Py_IS_INFINITY(r)) {
    if (Py_IS_FINITE(x))
        errno = can_overflow ? ERANGE : EDOM;
    else
        errno = 0;
}

funcsinはシステム関数へのポインターであり、 can_overflow0 です。したがって、システムは、指定された入力に対してsin戻り値NaN または無限大のいずれかになります。

于 2013-09-09T19:43:50.833 に答える
0

でもsin(x) ~ x、原点あたりで、なんでそんなに気になるの?減算x**3/6.0は、ほとんどの計算に十分に近づける必要があります (そうでない場合は、x**5/120.0 を追加する必要があります)。

于 2013-09-09T08:57:58.317 に答える