কেন স্পটলাইট `কোস (পাই / 2) for এর জন্য একটি ভুল মান দেয়?


8

আপনি জানেন যে স্পটলাইট সাধারণ গণিত করতে পারে। উদাহরণস্বরূপ, টাইপিংয়ের cos(pi)ফলস্বরূপ -1, যেমনটি আপনি আশা করতে পারেন। আমি কেবল টাইপ করেছি cos(pi/2), যা 0 হওয়া উচিত তবে এটি আমাকে দিয়েছে -5e-12

হ্যা এটা একটা rounding ত্রুটির কারণে সম্ভবত, কিন্তু চলো: cos(pi/2)! আমার মতে, এটি স্পষ্টত বাগের মতো দেখাচ্ছে। আপনি কি মনে করেন?


1
কোস (এক্স) একটি ট্রান্সইডেন্টাল ফাংশন। পাই, পাই / ২ ইত্যাদি ইত্যাদির জন্য তারা হার্ডকোড না করে আপনার কিছু ত্রুটি আশা করা উচিত।
নবীন

@ নবীন আসলে আমি তাদের কাছে এই মানগুলি হার্ড-কোড করার আশা করি যেহেতু তারা অত্যন্ত গুরুত্বপূর্ণ।
পোইট্রোয়ে

1
piনিজেই হার্ড-কোডিং হবে (আপনি যেমন -১ পেয়ে যাবেন cos(pi)) তবে আপনি এটিকে পরিচালনা করার সাথে সাথে আপনি একটি ভাসমান পয়েন্ট নম্বর পাবেন, যার যথার্থতা সীমিত। ওএসএক্স না হার্ড কোড আছে pi/2, pi/4ইত্যাদি এটা আসলে অপারেশন আছে।
harryg

2
@harryg যখন গোলাকৃতি ত্রুটি রয়েছে যা দশমিকের দিকে স্যুইচ করে সমাধান করা যায়, এটি তাদের মধ্যে একটি নয়। ডেসিমাল কার্যকর যদি আপনি প্রতিনিধিত্ব করতে চান 0.1। অবিকল, তবে পাই এর মতো অযৌক্তিক সংখ্যার জন্য এটি কার্যকর নয় যা বাইনারি বা দশমিক উভয় ক্ষেত্রে হুবহু উপস্থাপন করা যায় না।
কোডসইনচওস

1
রেফারেন্সের জন্য, রুবিতে:irb(main):009:0> Math.cos(Math::PI/2) => 6.123233995736766e-17
হারিগ

উত্তর:


13

এটি পাইয়ের নির্ভুলতার অভাব এবং অন্তর্নির্মিত সিস্টেমে সামগ্রিকভাবে নির্ভুলতার অভাবের কারণে।

pi = 3.1415926536

pi/2 = 1.5707963268 

cos(1.5707963268) = -5.103412e-12

FYI =  5.103412e-12 = 0.000000000005103412 ~ 0 


সামগ্রিক সিস্টেমের নির্ভুলতা সম্পর্কে:

3.141592653589793238462643383 = 3.1415926536 

পাইথনে আমরা নিম্নলিখিত পেতে পারি:

>>> float("3.141592653589793238462643383")
3.141592653589793

আমরা দেখতে পাচ্ছি যে নির্ভুলতার সাথে সমস্যা আছে কারণ এটি এমনকি ভাসমান প্রতিনিধির সাথেও মেলে না।


এটি নির্ভুলতার অভাবের কারণে, তবে এই প্রস্থের একটি ত্রুটি ভাসমান পয়েন্ট সংখ্যার উপর দোষ দেওয়া যায় না।
ডেনিস জহেরুদ্দিন

2
এটি সম্ভবত পাই মানটির সাথে আরও নির্ভুলতার অভাব রয়েছে।
ম্যাথিউ রিগলার

5

তারা স্টোর করছেন না unusual অস্বাভাবিক ভাসমান-পয়েন্ট যথার্থতার সাথে। তারা ডাবল স্পষ্টতা সহ π এর জন্য একটি ভুল মান ব্যবহার করছে। করতে আনুমানিক বাইনারি মধ্যে 3,1415926536, অন্তত 38 বিট প্রয়োজন:

3.14159265359922… > 11.001001000011111101101010100010001001

লক্ষ্য করুন 2 ^ -36 1.5e -11, trailing 99. সঙ্গে যা সমানুপাতিক সম্পর্কে যে ডাবল স্পষ্টতা ফ্লোটিং পয়েন্ট একটি 52-বিট significand হয়েছে। cos(pi/2)-5e-12 হিসাবে মূল্যায়ন করতে , কেবলমাত্র অন্য সম্ভাব্য পছন্দটি হ'ল 48-বিট টাইপ, যা খুব আশ্চর্যজনক হবে।

0 এবং Near এর কাছাকাছি যেখানে ডেরাইভেটিভ প্রায় শূন্য সেখানে কোস (θ) খুব নির্ভুলভাবে গণনা করা যায় না:

cos(3.1415926536) ≈ -0.999999999999999999999947911

এটি -1 থেকে প্রায় 5.2e-23 দ্বারা পৃথক, যা ε এর চেয়ে ছোট double, সুতরাং সঠিক -১ cos(3.1415926536)হিসাবে গণনা করা হয় ... যা ভুল।

± π / 2 এর কাছাকাছি, ডেরাইভেটিভ [ -সিন (θ) ] প্রায় ± 1, সুতরাং ইনপুটটিতে ত্রুটি আউটপুট হয়ে যায়।

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

আমার কাছে এমন টিআই ক্যালকুলেটর রয়েছে যা একটি কম ডিজিট প্রদর্শন করে এবং cos(π/2)-5.2e-12 হিসাবে গণনা করে । তবে এটি বৈদ্যুতিনভাবে খুব আলাদা এবং এর জন্য একটি সঠিক মান দেওয়ার জন্য ডিজাইন করা হয়েছিল cos(90°)

আমি অনুমান করব যে স্পটলাইটে, cos(pi/2)π এর জন্য একটি মান পুনরুদ্ধার করে দশমিক স্ট্রিংয়ে রূপান্তর করে গণনা করা হচ্ছে (যথাযথ, যুক্তিযুক্ত) বাইনারি মান হিসাবে 11,0010010000111111010101010001000100100001101101111 (বা 10000), 2 দ্বারা বিভাজক করে এবং তারপরে এটিকে মূলত বিয়োগ করে value / 2 এর আসল মান । আপনার খুঁজে পাওয়া উচিত cos(pi/2 + cos(pi/2))শূন্যের কাছাকাছি কিনা (এটি -2.2e-35 হতে পারে)।

দু'জনের পাওয়ার দ্বারা গুণ করা কেবল বেদীকে প্রভাবিত করে, তাত্পর্য নয়। বারবার অর্ধেক বা দ্বিগুণ হওয়ার মাধ্যমে রাউন্ডিং কীভাবে প্রয়োগ করা হয় তা নির্ধারণ করা সম্ভব।


মার্কডাউন-তে কোনও কিছুই ভুল নয় - ম্যাথজ্যাক্স কেবলমাত্র গণিত সম্পর্কিত সাইটগুলিতে সক্ষম হয়েছে, এসই-প্রশস্ত নয়।
গ্রিগ

1
কোস (পাই / 2 + কোস (পাই / 2)) ঠিক 0 হিসাবে প্রদর্শিত হয়।
নিক মাত্তিও

4

এটি একটি বাগ যা ১০.৯.২-এ পুনরায় উত্পাদনযোগ্য - এবং এর মতো একটি ভাসমান পয়েন্ট গোলাকার ত্রুটিটি বেশ সাধারণ is

এটি পাইয়ের মান যা যদি অনুমান করতে হয় তবে যথেষ্ট নির্ভুলতা ছাড়াই পরিচালিত হচ্ছে।

  • কারণ (999999 * পাই) এর একটি ত্রুটি নেই
  • কারণ ((999999 + 1) * পাই) এর একটি ত্রুটি রয়েছে - সম্ভবত গোলাকার

আপনি যদি অ্যাপলের বাগ ফিক্সিং যন্ত্রপাতিটি কার্যত দেখতে চান তবে আমি https://developer.apple.com/bug-reporting/ এ যেতে চাই।


5
সত্যিই কি এটি একটি বাগ? এই ধরনের একটি অপারেশন সম্পর্কে নির্ভুলতা কি হওয়া উচিত?
ডওয়ার্ড

আমি নিবন্ধিত বিকাশকারী নই, তবে আপনি যদি আমাদের জন্য এটি জমা দিতে পারেন তবে আমি খুব কৃতজ্ঞ হব!
পোইট্রোয়ে

4
@ অ্যাডওয়ার্ড আপনি সম্ভবত এটি একটি বাগ হিসাবে বিবেচনা করতে পারেন যদি ব্যবহারকারীকে প্রতীকী গণিতের জন্য কিছু সক্ষমতা আশা করতে পরিচালিত করা হয়। যে কোনও কম্পিউটার বীজগণিত সিস্টেম (সিএএস) অবশ্যই জানবে যে কোস (π / 2) = 0 ঠিক! অন্যদিকে, স্পটলাইটে কোনও সিএএস থাকবে আশা করা খুব কমই যুক্তিসঙ্গত। এবং ভাসমান পয়েন্ট গণিতের রাজ্যে, ওপি রিপোর্টগুলির মতো ফলাফল আশা করা যায়। কোনও বাগ রিপোর্ট সম্ভবত বৈশিষ্ট্যের অনুরোধ হিসাবে আরও ভাল লেবেলযুক্ত হতে পারে।
হ্যারাল্ড হানচে-ওলসেন

1
@ অ্যাডওয়ার্ড বিমিক আসলে সত্য যে এটি একটি বাগ এবং ঠিক রাউন্ডঅফ ত্রুটি নয়। স্ট্যান্ডার্ড ডাবল স্পষ্টতা পাটিগণিত দেওয়া যেমন এই ধরনের অপারেশনটির প্রত্যাশিত নির্ভুলতা প্রায় 10 ^ -16, 10 ^ -12 নয়। আপনি নিজের প্রিয় ভাষায় এমন একটি প্রোগ্রাম লিখে এটি চেষ্টা করতে পারেন যা সিপিইউর ভাসমান পয়েন্ট সমর্থনটি গ্রহণ করে, গণনাটি করে, এবং ফলাফলের বিট প্যাটার্নটি পরীক্ষা করে। বিমিক যেমন বলেছে, সম্ভবত কারণ হ'ল স্পটলাইট যে the মান ব্যবহার করে তা যথাযথ নির্ভুলতার সাথে সংজ্ঞায়িত হয় না।
স্যাজাবলস

2
অদ্ভুত কিছু এখানে চলছে। cos(2*acos(0)*0.5)অর্ডার একটি সংখ্যা ফেরত 10^-10। সুতরাং এটি কারণ নয় যে π ধ্রুবক যথেষ্ট পরিমাণে সুনির্দিষ্ট নয়। আমি এই ফলাফলটি ব্যাখ্যা করতে পারি না: এটি ডাবল নির্ভুলতার জন্য খুব অদক্ষ এবং একক নির্ভুলতার জন্য খুব নির্ভুল।
কাজ Szabolcs

4

অন্যান্য উত্তর এবং মন্তব্য থেকে নীচে পরিষ্কার হয়ে যায়:

আপনি যে ননজারো ফলাফল পেয়েছেন তা কোনও ত্রুটি নয়, এমনকি সফ্টওয়্যারটির নিখুঁত প্রয়োগের সাথে আপনি ভাসমান পয়েন্ট গণনার সীমাতে চলে যান। তবে, 10 ^ -12 এর ক্রমের ত্রুটিটি সত্যিই বড়।

এটি ভাসমান পয়েন্ট সংখ্যাগুলির অপ্রতুলতার জন্য দোষারোপ করার মতো নয়। আপনি যে ফলাফলটি পান তা হ'ল:

cos(1.5707963268)

যে কোনও বিকল্প সফ্টওয়্যার প্যাকেজ ব্যবহার করে যাচাই করা যেতে পারে। আপনি যদি cos(pi/2)এই প্যাকেজগুলির মধ্যে একটিতে মূল্যায়ন করতে চান তবে আপনি অবশ্যই 10 ^ -12 এর চেয়ে শূন্যের খুব কাছাকাছি ফলাফল পাবেন।

উপসংহারে আমি দুটি সম্ভাব্য সীমাবদ্ধতা দেখতে পাচ্ছি, যার একটি অবশ্যই প্রযোজ্য:

  1. পাই পর্যাপ্ত নির্ভুলতা সহ সঞ্চয় করা হয় না, বা কমপক্ষে পাই / 2 এর অপর্যাপ্ত নির্ভুলতার ফলাফল results
  2. ইনপুট হিসাবে কেবল অপর্যাপ্ত নির্ভুলতা নেয়

সম্ভবত সফ্টওয়্যারটিতে অ্যাক্সেস পাওয়া কেউ এইগুলির মধ্যে যা প্রযোজ্য তা যাচাই করতে পারে।

আপডেট মন্তব্যটিতে উল্লিখিত হিসাবে সমস্যাটি ধ্রুবকের যথার্থতা বলে মনে হচ্ছে pi


এটা অদ্ভুত। 1.5707963268 আপনি পাই / 2 গণনা করার পরে ফলাফলটি স্পটলাইট দেয়। কয়েকটি সাধারণ চেষ্টার পরে, মনে হয় স্পটলাইট 1 এবং 11 এর উপরে সংখ্যাগুলির জন্য 10 টি গুরুত্বপূর্ণ সংখ্যা প্রদর্শন করে তবে কী অদ্ভুত বাস্তবায়নের কারণের পরে গণনার অভ্যন্তরে একটি গোলাকার পদক্ষেপ প্রয়োগ করা হবে?
ouডার্ড

1
আমি আরও উল্লেখ করতে চেয়েছিলাম যে আপনি যদি স্পটলাইটকে আরও সুনির্দিষ্ট আনুমানিক পাই / 2 সরবরাহ করেন (ওল্ফ্রাম আলফা থেকে 10 টির বেশি অঙ্ক যেমন কপি-পেস্ট করে), স্পষ্টতা বৃদ্ধি পায়।
এডওয়ার্ড

আমার অনুমানের সত্যতা নিশ্চিত করার জন্য ধন্যবাদ যে পাই এর যথার্থতা ওপির প্রশ্নের মধ্যে 0 এবং মোটামুটি 10 ​​^ -12 এর মধ্যে ত্রুটির কারণ ছিল।
bmike

আপনি কতবার এটি দেখতে পান: "10 ^ -12 সত্যিই বড়"
জিডগার

2

-5e-12এটি একটি verryyyy ছোট সংখ্যা হিসাবে বিবেচনা করে , এটি একটি বৃত্তাকার ত্রুটি।

আমি মনে করি এটি piট্রাইগ ফাংশন গণনা করতে ব্যবহৃত ধ্রুবক বা অসীম সিরিজের সংজ্ঞা হিসাবে ব্যবহৃত হয় তার চেয়ে বেশি দশমিক দেখানোর স্পটলাইটের পরিণতি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.