ทำไม Spotlight ถึงให้ค่าที่ไม่ถูกต้องสำหรับ `cos (pi / 2) '


8

อย่างที่คุณอาจรู้ Spotlight สามารถทำคณิตศาสตร์ง่ายๆ ตัวอย่างเช่นการพิมพ์ cos(pi) จะส่งผลให้ -1อย่างที่คุณอาจคาดหวัง ฉันเพิ่งพิมพ์ cos(pi/2)ซึ่งควรเป็น 0 แต่ให้ฉัน -5e-12.

ใช่มันอาจเป็นเพราะข้อผิดพลาดในการปัดเศษ แต่มีดังนี้: cos(pi/2)! ในความคิดของฉันมันดูเหมือนว่าบั๊ก คุณคิดอย่างไร?


1
cos (x) เป็นฟังก์ชันยอดเยี่ยม นอกจากว่าพวกเขาจะ hardcode ค่าสำหรับ pi, pi / 2 ฯลฯ คุณควรคาดหวังข้อผิดพลาด
Navin

@Navin จริง ๆ แล้วฉันคาดหวังให้พวกเขาเขียนโค้ดค่าเหล่านี้เนื่องจากมันสำคัญมาก
poitroae

1
pi ตัวเองจะเป็นรหัสยาก (ตามที่คุณได้รับ -1 สำหรับ cos(pi) ) แต่ทันทีที่คุณจัดการมันคุณจะได้รับหมายเลขทศนิยมซึ่งมีความแม่นยำ จำกัด OSX ไม่ใช่รหัสยาก pi/2, pi/4 ฯลฯ มันใช้งานจริง
harryg

2
@harryg ในขณะที่มีข้อผิดพลาดในการปัดเศษที่สามารถแก้ไขได้โดยเปลี่ยนเป็นทศนิยม แต่นี่ไม่ใช่หนึ่งในนั้น ทศนิยมมีประโยชน์ถ้าคุณต้องการเป็นตัวแทน 0.1 อย่างแน่นอน แม่นยำ แต่ไม่มีประโยชน์สำหรับตัวเลขที่ไม่มีเหตุผลเช่น pi ซึ่งไม่สามารถแสดงได้อย่างแม่นยำทั้งแบบไบนารีหรือทศนิยม
CodesInChaos

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

อย่างที่เราเห็นมีปัญหากับความแม่นยำเนื่องจากมันไม่ตรงกับการแทนทุ่น


มันเกิดจากการขาดความแม่นยำ แต่ข้อผิดพลาดของขนาดนี้ไม่สามารถถูกตำหนิบนหมายเลขจุดลอย
Dennis Jaheruddin

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ดังนั้น cos(3.1415926536) คำนวณเป็น อย่างแน่นอน -1 ... ซึ่งไม่ถูกต้อง

ใกล้±π / 2, อนุพันธ์ [ -sin (θ) ] เกือบ± 1 ดังนั้นข้อผิดพลาดที่อินพุตจะกลายเป็นเอาท์พุท

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

ฉันบังเอิญมีเครื่องคิดเลข TI ที่แสดงตัวเลขน้อยลงหนึ่งหลักและคำนวณ cos(π/2) เช่น -5.2e-12 อย่างไรก็ตามมันแตกต่างกันมากทางอิเล็กทรอนิกส์และถูกออกแบบมาเพื่อให้คุณค่าที่แน่นอนสำหรับ cos(90°).

ฉันเดาว่าใน Spotlight cos(pi/2) กำลังคำนวณโดยดึงค่าสำหรับπ, การแปลงเป็นสตริงทศนิยม เก็บไว้ว่าเป็นค่าไบนารี (แน่นอน, มีเหตุผล) 11.00100100001111110110101010001000100100001101101111 (หรือ 10,000) หารด้วย 2 แล้วลบออกจาก คุณค่าที่แท้จริง ของπ / 2 คุณควรตรวจสอบว่า cos(pi/2 + cos(pi/2)) ใกล้ศูนย์ (อาจเป็น -2.2e-35)

การคูณด้วยกำลังสองควรส่งผลกระทบเฉพาะเลขชี้กำลังไม่ใช่นัยสำคัญ อาจเป็นไปได้ที่จะกำหนดวิธีการปัดเศษโดยใช้การลดลงครึ่งหนึ่งซ้ำหรือสองเท่า


ไม่มีอะไรที่เป็น ไม่ถูกต้อง ด้วย Markdown - MathJax จะเปิดใช้งานเฉพาะในเว็บไซต์ที่เกี่ยวข้องกับคณิตศาสตร์เท่านั้นไม่ใช่ SE-wide
grg

1
cos (pi / 2 + cos (pi / 2)) แสดงเป็น 0 อย่างแน่นอน
kundor

4

มันเป็นข้อผิดพลาดที่สามารถทำซ้ำได้ใน 10.9.2 - และข้อผิดพลาดในการปัดเศษจุดลอยตัวที่เป็นเรื่องปกติ

มันคือค่าของ pi ที่ถูกจัดการโดยไม่มีความแม่นยำเพียงพอถ้าฉันต้องเดา

  • cos (999999 * pi) ไม่มีข้อผิดพลาด
  • cos ((999999 + 1) * pi) มีข้อผิดพลาด - มีแนวโน้มการปัดเศษ

ฉันจะไปที่ https://developer.apple.com/bug-reporting/ หากคุณต้องการดูเครื่องมือแก้ไขข้อบกพร่องของ Apple ในทางปฏิบัติ


5
มันเป็นข้อผิดพลาดจริงเหรอ? สิ่งที่ควรมีความแม่นยำในการดำเนินการดังกล่าว?
Édouard

ฉันไม่ได้เป็นนักพัฒนาที่ลงทะเบียน แต่ฉันจะขอบคุณมากถ้าคุณสามารถส่งมาให้เรา!
poitroae

4
@ Édouard You อาจ พิจารณาว่าเป็นข้อผิดพลาดหากผู้ใช้ได้รับการคาดหวังว่าจะมีความสามารถด้านคณิตศาสตร์เชิงสัญลักษณ์ แน่นอนว่าระบบพีชคณิตของคอมพิวเตอร์ (CAS) จะรู้ว่า cos (π / 2) = 0 แน่นอน! ในทางกลับกันก็ไม่เหมาะสมที่จะคาดหวังว่า Spotlight จะมี CAS และในขอบเขตของการคำนวณเลขทศนิยมจะต้องได้ผลลัพธ์เช่นรายงาน OP รายงานข้อผิดพลาดใด ๆ อาจติดป้ายกำกับคำขอคุณสมบัติได้ดีกว่า
Harald Hanche-Olsen

1
@ Édouard bmike นั้นถูกต้องแล้ว นี่เป็นข้อผิดพลาด และไม่ใช่แค่ข้อผิดพลาด roundoff ความแม่นยำที่คาดหวังของการดำเนินการดังกล่าวซึ่งได้รับความแม่นยำเลขคณิตมาตรฐานสองเท่าคือประมาณ 10 ^ -16 ไม่ใช่ 10 ^ -12 คุณสามารถลองด้วยตัวคุณเองได้ด้วยการเขียนโปรแกรมในภาษาที่คุณชื่นชอบซึ่งใช้ประโยชน์จากการสนับสนุนจุดลอยตัวของ CPU ทำการคำนวณและตรวจสอบรูปแบบบิตของผลลัพธ์ ดังที่ bmike กล่าวเหตุผลที่เป็นไปได้คือค่า that ที่ Spotlight ใช้นั้นไม่ได้ถูกกำหนดด้วยความแม่นยำเพียงพอ
Szabolcs

2
มีบางอย่างแปลก ๆ เกิดขึ้นที่นี่ cos(2*acos(0)*0.5) ส่งคืนคำสั่งซื้อจำนวนหนึ่ง 10^-10. ดังนั้นไม่ใช่เพราะค่าคงที่ precise นั้นไม่แม่นยำพอ ฉันไม่สามารถอธิบายผลลัพธ์นี้ได้: มันไม่แม่นยำเกินไปสำหรับความแม่นยำสองเท่าและแม่นยำเกินไปสำหรับความแม่นยำเดียว
Szabolcs

4

จากคำตอบและความคิดเห็นอื่น ๆ ต่อไปนี้จะกลายเป็นชัดเจน:

ความจริงที่ว่าคุณได้รับผลลัพธ์ที่ไม่ใช่ศูนย์ไม่ใช่ข้อผิดพลาดถึงแม้จะมีการใช้งานซอฟต์แวร์ที่สมบูรณ์แบบคุณจะพบข้อ จำกัด ของการคำนวณจุดลอยตัว อย่างไรก็ตามข้อผิดพลาดตามลำดับ 10 ^ -12 นั้นใหญ่มาก

นี่ไม่ใช่การตำหนิความไม่ถูกต้องของตัวเลขทศนิยม ผลลัพธ์ที่คุณได้รับคือ:

cos(1.5707963268)

ที่สามารถตรวจสอบได้โดยใช้แพคเกจซอฟต์แวร์อื่นใดก็ได้ ถ้าคุณจะประเมิน cos(pi/2) ในแพ็คเกจเหล่านี้คุณจะได้ผลลัพธ์ใกล้เคียงกับศูนย์มากกว่า 10 ^ -12

ในการสรุปฉันเห็นข้อ จำกัด ที่เป็นไปได้สองข้อข้อหนึ่งซึ่งต้องใช้:

  1. Pi ไม่ได้ถูกจัดเก็บด้วยความแม่นยำเพียงพอหรืออย่างน้อย pi / 2 ส่งผลให้ความแม่นยำไม่เพียงพอ
  2. Cos ใช้ความแม่นยำไม่เพียงพอในฐานะอินพุต

บางทีบางคนที่สามารถใช้ซอฟต์แวร์สามารถตรวจสอบความถูกต้องของสิ่งเหล่านี้ได้

ปรับปรุง ตามที่ระบุไว้ในความคิดเห็นปัญหาดูเหมือนจะเป็นความแม่นยำของค่าคง pi.


นี่มันแปลก 1.5707963268 คือผลลัพธ์ที่น่าสนใจให้คุณเมื่อคุณคำนวณ pi / 2 หลังจากพยายามง่ายๆไม่กี่ครั้งดูเหมือนว่า Spotlight จะแสดง 10 หลักสำคัญสำหรับตัวเลขที่ต่ำกว่า 1 และ 11 สำหรับตัวเลขที่สูงกว่า 1 แต่สำหรับเหตุผลการใช้งานแปลก ๆ สิ่งที่จะมีขั้นตอนการปัดเศษ ภายใน การคำนวณแทนหลังจาก?
Édouard

1
ฉันอยากจะชี้ให้เห็นว่าถ้าคุณให้สปอตไลท์ด้วยการประมาณที่แม่นยำยิ่งขึ้น pi / 2 (โดยการคัดลอกการวางมากกว่า 10 หลักจาก Wolfram Alpha เช่น) ความแม่นยำจะเพิ่มขึ้น
Édouard

ขอบคุณสำหรับการยืนยันของฉันเดาว่าความแม่นยำของปี่เป็นสาเหตุของข้อผิดพลาดระหว่าง 0 และประมาณ 10 ^ -12 ในคำถามของ OP
bmike

คุณเห็นสิ่งนี้บ่อยเพียงใด: "10 ^ -12 ใหญ่มาก"
GEdgar

2

เมื่อพิจารณาแล้วว่า -5e-12 เป็นจำนวนน้อย verryyyy นี้ คือ ข้อผิดพลาดในการปัดเศษ

ฉันคิดว่ามันเป็นผลมาจากสปอตไลท์ที่แสดงทศนิยมมากกว่าที่ใช้ในคำจำกัดความของ pi ค่าคงที่หรืออนุกรมอนันต์ที่ใช้คำนวณฟังก์ชันตรีโกณมิติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.