Spotlightが `cos(pi / 2)`に誤った値を与えるのはなぜですか?


8

ご存知かもしれませんが、Spotlightは簡単な数学を実行できます。たとえば、タイプcos(pi)すると-1、予想どおりにが表示されます。私は単にcos(pi/2)0と入力するだけで入力しましたが、それは私に与えました-5e-12

はい、おそらく丸め誤差が原因ですが、次のようになりますcos(pi/2)。私の意見では、それは明らかにバグのように見えます。どう思いますか?


1
cos(x)は超越関数です。pi、pi / 2などの値をハードコーディングしない限り、エラーが発生するはずです。
Navin、2014年

@Navinは非常に重要であるため、実際にはこれらの値をハードコーディングすることを期待しています。
poitroae 14年

1
piそれ自体はハードコード化されますが(の場合は-1が得られますcos(pi))、操作するとすぐに浮動小数点数が得られますが、精度に制限があります。OSXはハードコードしないpi/2pi/4など、実際の操作を行います。
ハリーグ

2
@harryg 10進数に切り替えることで解決できる丸め誤差がありますが、これはその1つではありません。10進数は、0.1正確に表現したい場合に便利です。正確には、しかし、それは2進数でも10進数でも正確に表すことができないpiのような無理数には役に立ちません。
CodesInChaos 14年

1
参考までに、Rubyの場合:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
harryg

回答:


13

これは、piの精度の欠如と、組み込みシステムの全体的な精度の欠如が原因です。

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


システム全体の精度について:

3.141592653589793238462643383 = 3.1415926536 

Pythonでは、次のようになります。

>>> float("3.141592653589793238462643383")
3.141592653589793

ご覧のように、float表現とさえ一致しないため、精度に問題があります。


これは精度の欠如が原因ですが、この大きさのエラーは浮動小数点数に基づくものではありません。
Dennis Jaheruddin 2014年

2
おそらく、pi値の精度の欠如です。
Matthieu Riegler

5

異常な浮動小数点精度でπを格納していません。倍精度でπに誤った値を使用しています。バイナリで3.1415926536 を概算するには、少なくとも38ビットが必要です。

3.14159265359922… > 11.001001000011111101101010100010001001

2 ^ -36は約1.5e-11であり、後続の99と一致することに注意してください。 倍精度浮動小数点には52ビットの仮数があります。cos(pi/2)-5e-12として評価するには、他に唯一​​可能な選択肢は48ビットタイプですが、これは非常に奇妙です。

微分係数がほぼゼロである0とπの近くでは、cos(θ)は非常に正確に計算できません。

cos(3.1415926536) ≈ -0.999999999999999999999947911

これは-1と約5.2e-23異なります。これはのεよりも小さいためdouble正確に -1 cos(3.1415926536)として計算されます...これは正しくありません。

±π/ 2に近い場合、導関数[ -sin(θ) ]はほぼ±1になるため、入力の誤差が出力になります。

cos(1.57079632679961) ≈ -4.71338076867830836e-12
cos(1.57079632679962) ≈ -4.72338076867830836e-12
cos(1.57079632680000) ≈ -5.10338076867830836e-12

たまたま、表示さcos(π/2)れる桁が1つ少なく、-5.2e-12 と計算されるTI電卓があります。ただし、これは電子的には非常に異なり、の正確な値を与えるように設計されていますcos(90°)

Spotlightでは、cos(pi/2)πの値を取得し、10進数の文字列に変換し、それを(正確な、有理)バイナリ値11.00100100001111110110101010001000100100001101101111(または10000)として保存し、2で除算してから、基本的にそれを減算することによって計算されていると思います真の値 π/ 2の。がcos(pi/2 + cos(pi/2))ゼロに近いかどうかを確認する必要があります(-2.2e-35の可能性があります)。

2のべき乗による乗算は、指数にのみ影響し、仮数には影響しません。丸めがどのように適用されるかを、半分または2倍に繰り返すことで判断できる場合があります。


Markdownに問題はありません— MathJaxは、SE全体ではなく、Math関連のサイトでのみ有効です。
grg

1
cos(pi / 2 + cos(pi / 2))は、正確に0と表示されます。
Nick Matteo

4

これは10.9.2で再現可能なバグであり、そのような浮動小数点丸めエラーは非常に一般的です。

私が推測しなければならない場合、十分な精度なしで処理されているのはpiの値です。

  • cos(999999 * pi)にはエラーがありません
  • cos((999999 + 1)* pi)にはエラーがあります-丸めの可能性があります

Appleのバグ修正装置の動作を確認したい場合は、https://developer.apple.com/bug-reporting/にアクセスます


5
本当にバグですか?そのような操作の精度はどうあるべきですか?
エドゥアール

私は登録開発者ではありませんが、私たちのためにそれを提出していただければ幸いです。
poitroae 14年

4
@Édouard ユーザーが記号数学の能力を期待するように導かれた場合、それをバグと考えるかもしれません。もちろん、すべてのコンピュータ代数システム(CAS)は、cos(π/ 2)= 0を正確に知っています。一方、SpotlightにCASが含まれることを期待することはほとんど合理的ではありません。そして、浮動小数点演算の領域では、OPレポートのような結果が期待されます。バグレポートは、機能のリクエストというラベルが付けられている可能性があります。
Harald Hanche-Olsen 2014

1
@Édouardbmikeは、これはバグであり、単なる丸め誤差ではないというのは事実です。標準の倍精度算術を想定すると、このような演算の予想精度は約10 ^ -16であり、10 ^ -12ではありません。CPUの浮動小数点サポートを利用するお気に入りの言語でプログラムを作成し、計算を行い、結果のビットパターンを調べることで、これを自分で試すことができます。bmikeが言うように、考えられる理由は、Spotlightが使用するπ値が十分な精度で定義されていないことです。
Szabolcs 2014年

2
ここで奇妙なことが起こっています。 cos(2*acos(0)*0.5)注文数を返します10^-10。したがって、π定数の精度が十分でないためではありません。この結果を説明することはできません。倍精度には不正確で、単精度には正確すぎます。
Szabolcs 2014年

4

他の回答とコメントから、次のことが明らかになります。

ゼロ以外の結果が得られるという事実はバグではありません。ソフトウェアを完全に実装したとしても、浮動小数点計算の限界にぶつかることになります。しかし、10 ^ -12程度の誤差は本当に大きいです。

これは、浮動小数点数の不正確さのせいではありません。あなたが得る結果はこれだけです:

cos(1.5707963268)

これは、代替ソフトウェアパッケージを使用して検証できます。cos(pi/2)これらのパッケージのいずれかで評価すると、間違いなく10 ^ -12よりもはるかにゼロに近い結果が得られます。

結論として、2つの可能な制限があり、そのうちの1つを適用する必要があります。

  1. Piが十分な精度で保存されていない、または少なくともpi / 2の結果、精度が不十分になる
  2. Cosは単に入力として不十分な精度を取ります

おそらく、ソフトウェアにアクセスできる誰かがこれらのどれが当てはまるかを検証できます。

更新 コメントで述べたように、問題は定数の精度にあるようpiです。


これは奇妙です。1.5707963268は、pi / 2を計算するときにSpotlightが提供する結果です。いくつかの簡単な試みの後、1と1以上しかし、奇妙なものを実装する理由のために番号の11以下の数の10桁を丸めステップが適用されるスポットライトディスプレイのように思えるの内部で計算の代わりに、後に?
エドゥアール

1
Spotlightにより正確な近似pi / 2を(たとえば、Wolfram Alphaから10桁以上コピーして貼り付けることにより)提供すると、精度が上がることも指摘しておきたい。
エドゥアール

OPの質問でpiの精度が0と約10 ^ -12の間のエラーの原因であったと私の推測を確認していただきありがとうございます。
bmike

どのくらいの頻度でこれを目にしますか:「10 ^ -12は本当に大きい」
GEdgar

2

-5e-12これ非常に小さな数であることを考えると、これ丸め誤差です。

これは、piトリガー関数の計算に使用される定数または無限級数の定義で使用されるよりも多くの小数をスポットライトが示すことの結果だと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.