সি গণনা পাপ () এবং অন্যান্য গণিতের কার্য কীভাবে করবে?


248

আমি। নেট বিচ্ছিন্নতা এবং জিসিসির উত্স কোডের মাধ্যমে পোর করেছি, তবে প্রকৃত বাস্তবায়ন sin()এবং অন্যান্য গণিত ফাংশনগুলি কোথাও খুঁজে পাচ্ছে না ... তারা সর্বদা অন্যরকম কিছু উল্লেখ করেছে বলে মনে হয়।

কেউ কি আমাকে সেগুলি খুঁজতে সাহায্য করতে পারে? আমার মনে হচ্ছে এটি অসম্ভাব্য যে সমস্ত হার্ডওয়্যার সি চালিত হবে যা হার্ডওয়্যারে ট্রিগ ফাংশন সমর্থন করে, তাই কোনও সফ্টওয়্যার অ্যালগরিদম কোথাও থাকতে হবে, তাই না ?


আমি বিভিন্নভাবে যে ফাংশন সচেতন আছি করতে গণনা করা, এবং মজার জন্য টেলর সিরিজ ব্যবহার কম্পিউট ফাংশন আমার নিজের রুটিন লিখেছেন। আমি কতটা বাস্তব, উত্পাদনের ভাষা এটি করে তা সম্পর্কে আগ্রহী, যেহেতু আমার সমস্ত বাস্তবায়ন সবসময়ই প্রস্থের বেশ কয়েকটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায় I


2
দয়া করে মনে রাখবেন এই বাস্তবায়ন নির্ভর। আপনি কোন
প্রয়োগায়

3
আমি নেট এবং সি ট্যাগ করেছিলাম কারণ আমি উভয় জায়গাতেই তাকিয়েছিলাম এবং কোনওটি বের করতে পারি না। যদিও নেট বিচ্ছিন্নতার দিকে তাকানো দেখে মনে হচ্ছে এটি নিয়ন্ত্রণহীন সি-তে ডাকা হতে পারে, তাই যতদূর আমি জানি তাদের একই প্রয়োগ রয়েছে।
হ্যাঙ্ক

উত্তর:


213

জিএনইউ লিবিমে, প্রয়োগটি sinসিস্টেম-নির্ভর। সুতরাং আপনি প্রতিটি প্ল্যাটফর্মের জন্য সিসডেপসের উপযুক্ত উপ-ডিরেক্টরিতে কোথাও বাস্তবায়নটি খুঁজে পেতে পারেন ।

একটি ডিরেক্টরি সিতে একটি বাস্তবায়ন অন্তর্ভুক্ত করে, যা আইবিএম দ্বারা অবদান রাখে। অক্টোবর ২০১১ সাল থেকে, আপনি sin()একটি আদর্শ x86-64 লিনাক্স সিস্টেমে কল করার সময় এটি কোডটি আসলে চলে । এটি fsinসমাবেশের নির্দেশের চেয়ে স্পষ্টতই দ্রুত । উত্স কোড: sysdeps / ieee754 / dbl-64 / s_sin.c , সন্ধান করুন __sin (double x)

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

  • যখন এক্স খুব হয় খুব 0 বন্ধ, sin(x) == xডান উত্তর।

  • আরও কিছুটা দূরে, sin(x)পরিচিত টেলর সিরিজটি ব্যবহার করে। তবে এটি কেবল 0 এর কাছাকাছি সঠিক, তাই ...

  • কোণটি যখন প্রায় ° ° এর বেশি হয়, তখন পাপ (এক্স) এবং কোস (এক্স) উভয়ের জন্য টেলর-সিরিজ অনুমানের গণনা করে, তারপরেই সংশোধন করার জন্য প্রাক্টম্পিউটেড টেবিলের মানগুলি ব্যবহার করে একটি আলাদা অ্যালগরিদম ব্যবহার করা হয়।

  • কখন | এক্স | > 2, উপরের অ্যালগরিদমের কোনওটিই কাজ করবে না, সুতরাং কোডটি 0 এর কাছাকাছি কিছু মান গণনা করে শুরু হয় যা দেওয়া sinবা cosপরিবর্তে দেওয়া যেতে পারে ।

  • এখনো মোকাবেলা করার আরেকটি শাখা হচ্ছে এক্স একটি NaN বা অনন্ত হচ্ছে।

এই কোডটি এমন কয়েকটি সংখ্যক হ্যাক ব্যবহার করে যা আমি এর আগে কখনও দেখিনি, যদিও সবার জন্য আমি জানি তারা সম্ভবত ভাসমান-পয়েন্ট বিশেষজ্ঞদের মধ্যে সুপরিচিত। কখনও কখনও কোড কয়েক লাইন ব্যাখ্যা করতে বিভিন্ন অনুচ্ছেদ নিতে হবে। উদাহরণস্বরূপ, এই দুটি লাইন

double t = (x * hpinv + toint);
double xn = t - toint;

sometimes / 2 এর একাধিক দ্বারা বিশেষত × π / 2 এর সাথে x এর চেয়ে আলাদা মানের 0 টির সাথে x হ্রাস করতে ব্যবহৃত হয় (কখনও কখনও) । বিভাগ বা শাখা ছাড়াই এটি যেভাবে করা হয় তা বরং চালাক। তবে এ নিয়ে কোনও মন্তব্য নেই!xn


জিসিসি / গ্লিবসি-র পুরানো 32-বিট সংস্করণ fsinনির্দেশাবলীটি ব্যবহার করেছে , যা কিছু ইনপুটগুলির জন্য আশ্চর্যজনকভাবে ভুল। এখানে মাত্র 2 টি লাইনের কোড সহ চিত্রিত করার জন্য একটি আকর্ষণীয় ব্লগ পোস্ট রয়েছে

sinখাঁটি সি তে fdlibm এর বাস্তবায়ন গ্লিবসি'র চেয়ে অনেক সহজ এবং সুন্দরভাবে মন্তব্য করা হয়েছে। উত্স কোড: fdlibm / s_sin.c এবং fdlibm / k_sin.c


35
এটি দেখতে যে আসলেই এই কোডটি x86 এ চলেছে: একটি প্রোগ্রাম সংকলন করে যে কল করে sin(); টাইপ gdb a.outকরুন, তারপর break sin, তারপর run, তারপর disassemble
জেসন ওরেডরফ

5
@ হেনরি: ভেবে ভুল করবেন না যে এটি ভাল কোড। এটি সত্যিই ভয়ানক , সেভাবে কোড করতে শিখবেন না!
টমাস বনিনি

2
@ আন্ড্রেস হুম, আপনি ঠিক বলেছেন, আইডিএম কোডটি fdlibm এর তুলনায় বেশ ভয়ঙ্কর দেখাচ্ছে। আমি fdlibm এর সাইন রুটিনে লিঙ্কগুলি যুক্ত করতে উত্তর সম্পাদনা করেছি।
জেসন ওরেডরফ

3
@ হেনরি: কে_সিন.সি. __kernel_sinতে সংজ্ঞায়িত করা হয়েছে, যদিও এটি খাঁটি সি again আবার ক্লিক করুন — আমি প্রথমবার ইউআরএল বটচড করেছি।
জেসন ওরেডরফ

3
লিঙ্কযুক্ত সিসডেপস কোডটি বিশেষত আকর্ষণীয় কারণ এটি সঠিকভাবে বৃত্তাকার। এটি হ'ল এটি দৃশ্যত সমস্ত ইনপুট মানগুলির জন্য সর্বাধিক সম্ভাব্য উত্তর দেয় যা কেবলমাত্র সম্প্রতি মোটামুটি সম্ভব হয়েছে। কিছু ক্ষেত্রে এটি ধীর হতে পারে কারণ সঠিক রাউন্ডিং নিশ্চিত করতে অনেকগুলি অতিরিক্ত অঙ্ক গণনা করা প্রয়োজন। অন্যান্য ক্ষেত্রে এটি অত্যন্ত দ্রুত - স্বল্প পরিমাণের জন্য উত্তরটি কেবল কোণ।
ব্রুস ডসন

66

সাইন এবং কোসিনের মতো ক্রিয়াকলাপগুলি মাইক্রোপ্রসেসরের অভ্যন্তরে মাইক্রোকোডে প্রয়োগ করা হয়। উদাহরণস্বরূপ, ইন্টেল চিপগুলির এগুলির জন্য সমাবেশ নির্দেশ রয়েছে। এসি সংকলক কোড উত্পন্ন করবে যা এই সমাবেশ নির্দেশাবলী কল করে। (বিপরীতে, একটি জাভা সংকলক তা করবে না Java

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


10
সাইন ও কোসাইন এর মতো ট্রান্সসেন্টেন্টাল ম্যাথ ফাংশনগুলি মাইক্রোকোডে বা বর্তমান 32-বিট ডেস্কটপ এবং সার্ভার প্রসেসরে হার্ডওয়্যার নির্দেশাবলী হিসাবে প্রয়োগ করা যেতে পারে। এটি সর্বদা ক্ষেত্রে ছিল না, যতক্ষণ না আই 486 (ডিএক্স) সমস্ত ভাসমান পয়েন্ট গণনা পৃথক কপিরোসেসর ছাড়াই x86 সিরিজের জন্য সফ্টওয়্যার ("সফট-ফ্ল্যাট") এ করা হত। যার সবকটিই (এফপিইউ) অন্তর্দীর্ঘ ফাংশন অন্তর্ভুক্ত করে না (যেমন ওয়েটেক 3167) 67
ম্যাকটাইলার

1
আপনি আরো নির্দিষ্ট হতে পারে? কীভাবে একজন টেলর সিরিজ ব্যবহার করে একটি "পোলিশ আপ" অনুমান করতে পারেন?
হ্যাঙ্ক

4
যতক্ষণ না কোনও উত্তর "পলিশিং" করা হয়েছে, ধরুন আপনি সাইন এবং কোসাইন উভয়ই গণনা করছেন। ধরুন আপনি এক পর্যায়ে উভয়ের সঠিক মূল্য জানেন (যেমন কর্ডিক থেকে) তবে কাছের পয়েন্টে মানটি চান। তারপরে অল্প পার্থক্য h এর জন্য, আপনি টেলর অনুমানের জন্য f (x + h) = f (x) + h f '(x) বা f (x + h) = f (x) + h f' (x) প্রয়োগ করতে পারেন + এইচ ^ 2 এফ '' (এক্স) / 2
জন ডি কুক

6
x86 / x64 চিপ সাইন (fsin) গণনা করার জন্য একটি সংসদীয় নির্দেশনা রয়েছে তবে এই নির্দেশটি কখনও কখনও বেশ ত্রুটিযুক্ত হয় এবং তাই আর খুব কমই ব্যবহৃত হয়। বিশদ জানতে র্যান্ডোমাসিআই.ওয়ার্ডপ্রেস.কম / 2014/10/01 / দেখুন । সর্বাধিক অন্যান্য প্রসেসর না না সাইন এবং কোসাইন জন্য নির্দেশাবলী কারণ তাদের সফটওয়্যারে গণক আরো নমনীয়তা দেয়, এবং আরও দ্রুত হতে পারে।
ব্রুস ডসন

3
ইন্টেল চিপগুলির অভ্যন্তরে কর্ডিক স্টাফগুলি সাধারণত ব্যবহৃত হয় না। প্রথমত, অপারেশনটির নির্ভুলতা এবং রেজোলিউশন অনেক অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ। কর্ডিক কুখ্যাতভাবে ত্রুটিযুক্ত হয় যখন আপনি 7 তম বা তত সংখ্যায় পৌঁছান এবং অপ্রত্যাশিত। দ্বিতীয়ত, আমি শুনেছি তাদের বাস্তবায়নে একটি ত্রুটি রয়েছে, যা আরও বেশি সমস্যার সৃষ্টি করে। আমি লিনাক্স জিসিসি-র জন্য পাপ ফাংশনটি দেখেছি এবং যথেষ্ট নিশ্চিত, এটি চেবিশেভ ব্যবহার করে। অন্তর্নির্মিত স্টাফ ব্যবহার করা হয় না। ওহ, এছাড়াও, চিপের কর্ডিক অ্যালগরিদমটি সফ্টওয়্যার সমাধানের চেয়ে ধীর।
ডোনাল্ড মারে

63

ওকে কিডিজ, পেশাদারদের জন্য সময় .... অনভিজ্ঞ সফ্টওয়্যার ইঞ্জিনিয়ারদের সাথে এটি আমার সবচেয়ে বড় অভিযোগ। এগুলি স্ক্র্যাচ (টেলরের সিরিজ ব্যবহার করে) ট্রান্সেন্ডেন্ডেন্টাল ফাংশনগুলি গণনায় আসে যেন তাদের জীবনে আগে কখনও এই গণনা করা হয়নি। সত্য না. এটি একটি সুস্পষ্ট সংজ্ঞায়িত সমস্যা এবং খুব চালাক সফ্টওয়্যার এবং হার্ডওয়্যার ইঞ্জিনিয়ারদের দ্বারা হাজার বার যোগাযোগ করা হয়েছে এবং এর একটি সুসংজ্ঞাত সমাধান রয়েছে। মূলত, ট্রান্সসেন্টালেন্টাল ফাংশনগুলির বেশিরভাগই তাদের গণনা করার জন্য চেবিশেভ বহুবচন ব্যবহার করে। কোনটি বহুপদী ব্যবহার করা হয় তা পরিস্থিতিগুলির উপর নির্ভর করে। প্রথমত, এই বিষয়ে বাইবেল হার্ট এবং চেনি দ্বারা পরিচালিত "কম্পিউটার অনুমান" নামে একটি বই is সেই বইটিতে আপনি কোনও হার্ডওয়্যার অ্যাডার, গুণক, বিভাজক ইত্যাদি আছে কিনা তা সিদ্ধান্ত নিতে পারেন এবং কোন অপারেশনটি দ্রুততর তা স্থির করতে পারেন। উদাহরণস্বরূপ, যদি আপনার সত্যিই দ্রুত বিভাজক থাকে, সাইন গণনা করার দ্রুততম উপায় হ'ল পি 1 (এক্স) / পি 2 (এক্স) যেখানে পি 1, পি 2 চেবিশেভ বহুবচন রয়েছে। দ্রুত বিভাজক ব্যতীত, এটি কেবলমাত্র পি (এক্স) হতে পারে, যেখানে পি এর P1 বা P2 এর চেয়ে অনেক বেশি পদ রয়েছে .... সুতরাং এটি ধীর হবে। সুতরাং, প্রথম পদক্ষেপটি আপনার হার্ডওয়্যার এবং এটি কী করতে পারে তা নির্ধারণ করা। তারপরে আপনি চেবিশেভ পলিনোমিয়ালগুলির উপযুক্ত সংমিশ্রণটি চয়ন করেন (সাধারণত কোসিনের জন্য ফর্ম কোস (কুঠার) = এপি (এক্স) হয়, আবার যেখানে পি একটি চেবিশেভ বহুবর্ষ)। তারপরে আপনি কোন দশমিক নির্ভুলতা চান তা স্থির করুন। উদাহরণস্বরূপ, যদি আপনি digit সংখ্যার যথার্থতা চান তবে আপনি যে বইটি উল্লেখ করেছেন তার যথাযথ টেবিলটিতে এটি দেখতে পাবেন এবং এটি আপনাকে (যথার্থতা = 7.33 এর জন্য) একটি নম্বর এন = 4 এবং একটি বহুপদী সংখ্যা 3502 দেবে N এন এর ক্রম বহুপদী (সুতরাং এটি p4.x ^ 4 + p3.x ^ 3 + p2.x ^ 2 + p1.x + p0), কারণ এন = 4। তারপরে আপনি পি 4, পি 3, পি 2, পি 1 এর আসল মানটি সন্ধান করবেন বইয়ের পিছনে পিএস এর মানগুলি 3502 এর নিচে (তারা ভাসমান স্থানে থাকবে)। তারপরে আপনি সফ্টওয়্যারটিতে আপনার অ্যালগরিদমটি ফর্মটিতে প্রয়োগ করেন: (((p4.x + p3) .x + p2) .x + p1) .x + p0 .... এবং এভাবেই আপনি কোসাইনকে 7 দশমিকের মধ্যে গণনা করতেন যে হার্ডওয়্যার উপর স্থান।

নোট করুন যে কোনও এফপিইউতে ট্রান্সসেন্টেন্টাল অপারেশনের বেশিরভাগ হার্ডওয়্যার বাস্তবায়ন সাধারণত কিছু মাইক্রোকোড এবং এই জাতীয় ক্রিয়াকলাপকে জড়িত করে (হার্ডওয়্যারের উপর নির্ভর করে)। চেবিশেভ বহুবর্ষগুলি বেশিরভাগ ট্রান্সসেন্টেন্টালের জন্য ব্যবহৃত হয় তবে সমস্ত নয় not উদাহরণস্বরূপ স্কুয়ার রুটটি প্রথমে দেখার টেবিলটি ব্যবহার করে নিউটন রাফসন পদ্ধতির দ্বিগুণ পুনরাবৃত্তি ব্যবহার করা আরও দ্রুত। আবার, "কম্পিউটার আনুমানিকতা" বইটি আপনাকে এটি বলবে।

যদি আপনি এই ফাংশনগুলিকে প্ররোচিত করার পরিকল্পনা করেন তবে আমি কাউকে সুপারিশ করব যে তারা সেই বইয়ের একটি অনুলিপি পান। এটি সত্যই এই ধরণের অ্যালগরিদমের বাইবেল। মনে রাখবেন যে কর্ডিকস ইত্যাদির মতো এই মানগুলি গণনা করার জন্য বিকল্প উপায়গুলির গুচ্ছ রয়েছে তবে এগুলি নির্দিষ্ট অ্যালগরিদমের জন্য সেরা হয়ে থাকে যেখানে আপনার কেবলমাত্র কম নির্ভুলতার প্রয়োজন। প্রতিবার নির্ভুলতার গ্যারান্টি রাখতে, চেবিশেভ বহুবর্ষগুলিই যাওয়ার উপায়। যেমন আমি বলেছি, ভাল সংজ্ঞায়িত সমস্যা। 50 বছর ধরে সমাধান করা হয়েছে ..... এবং এটি কীভাবে হয় তা স্থির করে।

এখন, বলা হচ্ছে, এমন কৌশল রয়েছে যার সাহায্যে চেবিশেভ বহুবর্ষগুলি নিম্ন ডিগ্রি বহুবর্ষীয় (উপরের কোসাইনের উদাহরণের মতো) দিয়ে একক নির্ভুলতার ফলাফল পেতে ব্যবহার করা যেতে পারে। তারপরে, "গাল এর যথাযথ টেবিল পদ্ধতি" এর মতো অনেক বড় বহুবর্ষে না গিয়েই নির্ভুলতা বাড়াতে মানগুলির মধ্যে বিভক্ত হওয়ার অন্যান্য কৌশল রয়েছে। এই পরবর্তী কৌশলটি পোস্টটি ACM সাহিত্যের উল্লেখ করছে what তবে শেষ পর্যন্ত, চেবিশেভ বহুবচনগুলি সেখানকার 90% পথ পেতে ব্যবহৃত হয়।

উপভোগ করুন।


6
প্রথম কয়েকটি বাক্যে আমি আরও একমত হতে পারি না। এছাড়াও, এটি স্মরণ করা মূল্যবান যে গ্যারান্টিযুক্ত যথার্থতার সাথে বিশেষ ফাংশনগুলির গণনা করা একটি কঠিন সমস্যা । আপনি যে চতুর লোকদের উল্লেখ করেছেন তারা তাদের জীবনের বেশিরভাগ সময় এটি করে ব্যয় করেন। এছাড়াও, আরও প্রযুক্তিগত নোটে, ন্যূনতম সর্বাধিক বহুবচনগুলি হ'ল চাঁচা-ছানা এবং চেবিশেভ বহুবর্ষগুলি তাদের জন্য সহজ প্রক্সি।
আলেকজান্দ্রি সি

161
অ-পেশাদার এবং র‌্যাম্বলিংয়ের (এবং হালকা অভদ্র) সুরের জন্য, এবং এই উত্তরটির আসল অ-নিরপেক্ষ বিষয়বস্তুটি মূলত উত্সাহিত করে "তারা প্রায়শই চেবিশেভ বহুবর্ষ ব্যবহার করে; এই বইটি দেখুন আরও তথ্যের জন্য, এটি সত্যিই ভাল! " কোনটি আপনি জানেন, এটি একেবারে সঠিক হতে পারে তবে আমরা এখানে এসও-তে চাই এমন এটি স্বয়ংসম্পূর্ণ উত্তরটি সত্যই নয় । এটির মতো নিবিষ্টভাবে, যদিও এটি প্রশ্নে একটি শালীন মন্তব্য করেছে।
ইলমারি করোনেন

2
প্রারম্ভিক গেম ডেভলপমেন্টের বছরগুলিতে, এটি সাধারণত গতির জন্য প্রয়োজনীয় টেবিলগুলির সাথে সম্পন্ন করা হত)। আমরা সাধারণত things জিনিসগুলির জন্য স্ট্যান্ডার্ড লিব ফাংশন ব্যবহার করি না।
topspin

4
আমি এম্বেড থাকা সিস্টেমে বেশিরভাগ ক্ষেত্রে এবং রেডিয়ানের পরিবর্তে বিটিয়ান (ল্যাডিয়ানদের পরিবর্তে) সারণী ব্যবহার করি তবে এটি কোনও বিশেষায়িত অ্যাপ্লিকেশনটির জন্য (আপনার গেমগুলির মতো)। আমার মনে হয় লোকটি সি কম্পাইলার কীভাবে ভাসমান পয়েন্ট সংখ্যাগুলির জন্য পাপ গণনা করে তাতে আগ্রহী ....
ডোনাল্ড মারে

1
আহ, 50 বছর আগে আমি ম্যাকলারেন সিরিজের সাহায্যে বুড়ো বি 220 তে এর সাথে খেলতে শুরু করেছি। পরে সিডিসি হার্ডওয়্যার এবং তারপরে মোটোরোলা 000৮০০০। আরকসিন অগোছালো ছিল - আমি দুটি বহুভিত্তির সংখ্যা বেছে নিয়েছি এবং অনুকূল সহগগুলি খুঁজে পেতে কোড বিকাশ করেছি।
রিক জেমস

15

জন্য sinবিশেষভাবে, টেলর সম্প্রসারণ ব্যবহার আপনাকে দিতে হবে:

sin (x): = x - x ^ 3/3! + x ^ 5/5! - এক্স ^ 7/7! + ... (1)

আপনি কোনও পদক্ষেপ যুক্ত হওয়া অবিরত রাখবেন যতক্ষণ না তাদের মধ্যে পার্থক্য গ্রহণযোগ্য সহনশীলতার মাত্রার চেয়ে কম হয় বা কেবল সীমাবদ্ধ পরিমাণের পদক্ষেপের জন্য (দ্রুত, তবে কম সুনির্দিষ্ট)। একটি উদাহরণ কিছু হবে:

float sin(float x)
{
  float res=0, pow=x, fact=1;
  for(int i=0; i<5; ++i)
  {
    res+=pow/fact;
    pow*=-1*x*x;
    fact*=(2*(i+1))*(2*(i+1)+1);
  }

  return res;
}

দ্রষ্টব্য: (1) ক্ষুদ্র কোণগুলির জন্য aproximation sin (x) = x এর কারণে কাজ করে। বৃহত্তর কোণগুলির জন্য আপনাকে গ্রহণযোগ্য ফলাফল পেতে আরও বেশি বেশি শর্তাদি গণনা করতে হবে। আপনি কিছুক্ষণ যুক্তি ব্যবহার করতে পারেন এবং একটি নির্দিষ্ট নির্ভুলতার জন্য চালিয়ে যেতে পারেন:

double sin (double x){
    int i = 1;
    double cur = x;
    double acc = 1;
    double fact= 1;
    double pow = x;
    while (fabs(acc) > .00000001 &&   i < 100){
        fact *= ((2*i)*(2*i+1));
        pow *= -1 * x*x; 
        acc =  pow / fact;
        cur += acc;
        i++;
    }
    return cur;

}

1
যদি আপনি সহগকে সামান্য সামান্য টুইট করেন (এবং এগুলিকে একটি বহুপদীতে হার্ড কোড করেন) তবে আপনি প্রায় 2 টি পুনরাবৃত্তি শীঘ্রই বন্ধ করতে পারেন।
রিক জেমস

14

হ্যাঁ, sinখুব গণনার জন্য সফ্টওয়্যার অ্যালগরিদম রয়েছে । মূলত, ডিজিটাল কম্পিউটারের সাথে এই ধরণের স্টাফ গণনা করা সাধারণত ফাংশনকে প্রতিনিধিত্ব করে টেলর সিরিজটি প্রায় অনুমান করার মতো সংখ্যাগত পদ্ধতি ব্যবহার করে করা হয়।

সংখ্যাসূচক পদ্ধতিগুলি নির্বিচার পরিমাণে নির্ভুলতার সাথে আনুমানিক ফাংশনগুলি আনতে পারে এবং যেহেতু আপনি একটি ভাসমান সংখ্যায় যথাযথতার পরিমাণ সীমাবদ্ধ, তাই তারা এই কাজগুলিকে বেশ ভালভাবে মানায়।


12
সত্যিকারের বাস্তবায়ন সম্ভবত কোনও টেলর সিরিজ ব্যবহার করবে না, কারণ আরও কার্যকর উপায় রয়েছে। আপনার কেবলমাত্র ডোমেনে [0 ... পাই / 2] তে সঠিকভাবে আনুমানিক প্রয়োজন, এবং এমন ফাংশন রয়েছে যা একটি টেলর সিরিজের চেয়ে আরও দক্ষতার সাথে একটি ভাল অনুমানের সরবরাহ করবে।
ডেভিড থর্নলে

2
@ ডেভিড: আমি সম্মত আমার উত্তরে "লাইক" শব্দটি উল্লেখ করার জন্য আমি যথেষ্ট যত্নবান ছিলাম। আনুমানিক ফাংশনগুলির পিছনে ধারণাটি ব্যাখ্যা করার জন্য টেলর সম্প্রসারণ একটি সহজ। এটি বলেছিল, আমি সফ্টওয়্যার বাস্তবায়ন দেখেছি (তারা অনুকূলিত হয়েছিল কিনা তা নিশ্চিত নয়) যা টেলর সিরিজ ব্যবহার করেছিল।
মেহরদাদ আফশারি

1
প্রকৃতপক্ষে, বহুবৃত্তীয় অনুমানগুলি ত্রিকোণমিত্রিক কার্যগুলি গণনা করার জন্য সবচেয়ে কার্যকর উপায়।
জেরেমি সালওয়েন

13

টেলর সিরিজটি ব্যবহার করুন এবং সিরিজের শর্তগুলির মধ্যে সম্পর্কের সন্ধান করার চেষ্টা করুন যাতে আপনি জিনিসগুলি বারবার গণনা করেন না

এখানে কোসিনাসের জন্য একটি উদাহরণ রয়েছে:

double cosinus(double x, double prec)
{
    double t, s ;
    int p;
    p = 0;
    s = 1.0;
    t = 1.0;
    while(fabs(t/s) > prec)
    {
        p++;
        t = (-t * x * x) / ((2 * p - 1) * (2 * p));
        s += t;
    }
    return s;
}

এটি ব্যবহার করে আমরা ইতিমধ্যে ব্যবহৃত একটি ব্যবহার করে যোগফলের নতুন শব্দটি পেতে পারি (আমরা বর্ণনামূলক এবং এক্স 2 পি এড়ানো )

ব্যাখ্যা


2
আপনি কী জানেন যে আপনি টেক্স ব্যবহার করে এই জাতীয় সূত্র তৈরি করতে গুগল চার্ট এপিআই ব্যবহার করতে পারেন? কোড.google.com/apis/chart/docs/gallery/formulas.html
গ্যাব রয়ের

11

এটি একটি জটিল প্রশ্ন। X86 পরিবারের ইনটেলের মতো সিপিইউতে sin()ফাংশনটির একটি হার্ডওয়ার বাস্তবায়ন রয়েছে তবে এটি x87 এফপিইউর অংশ এবং 64৪-বিট মোডে আর ব্যবহার করা হয়নি (যেখানে এসএসই 2 রেজিস্টার পরিবর্তে ব্যবহৃত হয়)। এই মোডে, একটি সফ্টওয়্যার বাস্তবায়ন ব্যবহৃত হয়।

এর বাইরে বেশ কয়েকটি বাস্তবায়ন রয়েছে। একটি fdlibm হয় এবং জাভা ব্যবহৃত হয়। যতদূর আমি জানি, গ্লিবসি বাস্তবায়নে fdlibm এর কিছু অংশ রয়েছে এবং অন্যান্য অংশগুলি IBM দ্বারা অবদান রাখে।

ট্রান্সসেন্টেন্টাল ফাংশনগুলির সফ্টওয়্যার বাস্তবায়ন যেমন sin()সাধারণত বহুবচনগুলির দ্বারা প্রায়শই ব্যবহার করা হয়, প্রায়শই টেলর সিরিজ থেকে প্রাপ্ত।


3
পাপ () নির্ধারণ করতে এসএসই 2 রেজিস্টার ব্যবহার করা হয় না , x86 বা x64 মোডেও নয় এবং মোড নির্বিশেষে হার্ডওয়্যারে পাপ গণনা করা হয়। আরে, এটি 2010 সালে আমরা থাকি :)
ইগোর কোরখভ

7
@ ইগর: এটি আপনি কোন গণিতের লাইব্রেরিটি দেখছেন তার উপর নির্ভর করে। দেখা যাচ্ছে যে x86 এর সবচেয়ে অপ্টিমাইজড গণিত গ্রন্থাগারগুলি এসএসই সফ্টওয়্যার বাস্তবায়ন ব্যবহার করে sinএবং cosএগুলি এফপিইউতে থাকা হার্ডওয়ারের নির্দেশাবলীর চেয়ে দ্রুত। সহজ, আরও নিষ্পাপ গ্রন্থাগারগুলির নির্দেশাবলী fsinএবং ব্যবহারের প্রবণতা রয়েছে fcos
স্টিফেন ক্যানন

@ স্টেফেন ক্যানন: এফপিইউ রেজিস্ট্রি করার সাথে সাথে এই দ্রুত গ্রন্থাগারগুলিতে কি 80 বিট যথার্থতা রয়েছে? আমার কাছে খুব স্পর্শকাতর সন্দেহ আছে যে তারা নির্ভুলতার চেয়ে গতির পক্ষে, যা অবশ্যই অনেক পরিস্থিতিতেই যুক্তিসঙ্গত, উদাহরণস্বরূপ গেমগুলিতে। এবং আমি বিশ্বাস করি যে এসএসই এবং প্রাক্পম্পিউটেড মধ্যবর্তী টেবিলগুলি ব্যবহার করে 32 বিট নির্ভুলতার সাথে সাইন গণনা FSINকরা সম্পূর্ণ নির্ভুলতার সাথে ব্যবহারের চেয়ে দ্রুত হতে পারে । আপনি যদি আমাকে সেই দ্রুত গ্রন্থাগারের নামগুলি বলেন তবে আমি খুব কৃতজ্ঞ হব a
ইগর কোরখভ

@ ইগর: 86৪-বিট মোডে x86 এ, কমপক্ষে আমি জানি সমস্ত ইউনিক্স-মতো সিস্টেমে নির্ভুলতা 64৪ বিটের মধ্যে সীমাবদ্ধ, x87 F এফপিইউয়ের 79৯ বিট নয়। সফ্টওয়্যার বাস্তবায়নটি গণনার sin()তুলনায় দ্বিগুণ দ্রুত হতে পারে fsin(অবিকল কারণ এটি কম নির্ভুলতার সাথে সম্পন্ন হয়েছে)। মনে রাখবেন যে x87 এর ঘোষিত b৯ বিটের চেয়ে কিছুটা কম প্রকৃত নির্ভুলতা বলে জানা গেছে।
থমাস পর্নিন

1
এমএসভিসি রানটাইম লাইব্রেরিতে 32-বিট এবং 64-বিট উভয়ই পাপ () প্রয়োগ করে FSIN নির্দেশ ব্যবহার করে না । আসলে, তারা বিভিন্ন ফলাফল দেয়, উদাহরণস্বরূপ পাপ নিন (0.70444454416678126)। এটি একটি 32-বিট প্রোগ্রামে 0.64761068800896837 (ডান 0.5% (ইপস / 2) সহনশীলতার সহিত) এর ফলাফল হিসাবে দেখাবে এবং একটি 64-বিট একটিতে 0.64761068800896848 (ভুল) ফলাফল করবে will
ই.তোদিউ

9

অন্য উত্তরে বর্ণিত শেবিশেভ বহুবর্ষগুলি হ'ল বহুবচন যেখানে ফাংশন এবং বহুপথের মধ্যে সবচেয়ে বড় পার্থক্য যতটা সম্ভব ছোট। এটি একটি দুর্দান্ত শুরু।

কিছু ক্ষেত্রে, সর্বাধিক ত্রুটি আপনার আগ্রহী নয় তবে সর্বাধিক আপেক্ষিক ত্রুটি। সাইন ফাংশনের উদাহরণস্বরূপ, x = 0 এর কাছাকাছি ত্রুটি বৃহত্তর মানগুলির তুলনায় অনেক ছোট হওয়া উচিত; আপনি একটি ছোট আপেক্ষিক ত্রুটি চান। সুতরাং আপনি পাপ এক্স / এক্স এর জন্য চেবিশেভ বহুবর্ষ গণনা করতে পারেন এবং সেই বহুবচনটি x দ্বারা গুণিত করবেন।

এর পরে আপনাকে কীভাবে বহুপদী মূল্যায়ন করতে হবে তা নির্ধারণ করতে হবে। আপনি এটিকে এমনভাবে মূল্যায়ন করতে চান যাতে অন্তর্বর্তী মানগুলি ছোট এবং তাই গোলাকার ত্রুটিগুলি ছোট are অন্যথায় বৃত্তাকার ত্রুটিগুলি বহুবর্ষের ত্রুটির চেয়ে অনেক বড় হয়ে উঠতে পারে। এবং সাইন ফাংশনের মতো ক্রিয়াকলাপগুলির সাথে, যদি আপনি অযত্ন থাকেন তবে সম্ভবত এটি হতে পারে যে আপনি পাপ x এর জন্য যে ফলাফল গণনা করেছেন তা পাপ y এর ফলাফলের চেয়েও বেশি x <y y বৃত্তাকার ত্রুটির জন্য গণনার ক্রমের যথাযথ পছন্দ এবং উপরের সীমার গণনা প্রয়োজন।

উদাহরণস্বরূপ, পাপ x = x - x ^ 3/6 + x ^ 5/120 - x ^ 7/5040 ... আপনি যদি নির্লিপ্তভাবে গণনা করেন x = x * (1 - x ^ 2/6 + x ^ 4 / 120 - এক্স ^ 6/5040 ...), তারপর বন্ধনীর মধ্যে ফাংশন হ্রাস পাচ্ছে যে, এবং এটি হবে ঘটতে যে যদি Y এক্স পাশে বড় সংখ্যা, তারপর মাঝে মাঝে পাপ Y চেয়ে পাপ এক্স ছোট হতে হবে। পরিবর্তে, sin x = x - x ^ 3 * (1/6 - x ^ 2/120 + x ^ 4/5040 ...) গণনা করুন যেখানে এটি ঘটতে পারে না।

চেবিশেভ বহুবর্ষগুলি গণনা করার সময়, সাধারণত ডাবল যথার্থতার জন্য আপনাকে সহগের গুণগুলি ঘুরতে হবে for তবে কোনও চেবিশেভ বহুবর্ষটি সর্বোত্তম হওয়ার পরে, দ্বিগুণ নির্ভুলতার সাথে গোলাকার সহগের সাথে চেবিশেভ বহুবর্ষটি দ্বিগুণ নির্ভুলতা সহগের সাথে সর্বোত্তম বহুবর্ষ নয়!

পাপের (x) উদাহরণস্বরূপ, যেখানে আপনার x, x ^ 3, x ^ 5, x ^ 7 ইত্যাদির জন্য সহগের দরকার হয় আপনি নিম্নলিখিতটি করেন: বহুবর্ষের সাথে পাপ x এর সর্বোত্তম অনুমানের গণনা করুন (ax + bx ^ 3 + cx prec 5 + dx ^ 7) দ্বিগুণ নির্ভুলতার চেয়ে বেশি, তারপরে একটিকে দ্বিগুণ নির্ভুলতা দিয়ে গোল করে, এ এবং A এর মধ্যে পার্থক্যটি বেশ বড় হবে। এখন একটি বহুবর্ষ (বিএক্স ^ 3 + সিএক্স ^ 5 + ডিএক্স ^ 7) এর সাথে (সিন এক্স - এক্স) সেরা সান্নিধ্যের গণনা করুন। আপনি বিভিন্ন সহগতি পেয়েছেন, কারণ এগুলি একটি এবং এ। রাউন্ড বি এর দ্বিগুণ যথাযথ বিয়ের সাথে পার্থক্যের সাথে খাপ খায় Then তারপর প্রায় (sin x - Ax - Bx ^ 3) বহুবর্ষীয় cx ^ 5 + dx ^ 7 এবং এর সাথে আরও অনেক কিছু রয়েছে। আপনি এমন একটি বহুবর্ষ পাবেন যা আসল চেবিশেভ বহুবর্ষের মতো প্রায় ভাল তবে চেবিশেভের চেয়ে দ্বিগুণ নির্ভুলতার চেয়ে অনেক ভাল।

এর পরে আপনার বহুপদী বাছাইয়ের ক্ষেত্রে গোলাকার ত্রুটিগুলি বিবেচনা করা উচিত। বৃত্তাকার ত্রুটি উপেক্ষা করার মাধ্যমে আপনি বহুবর্ষে ন্যূনতম ত্রুটিযুক্ত একটি বহুপদী খুঁজে পেয়েছেন, তবে আপনি বহুবর্ষীয় প্লাস রাউন্ডিং ত্রুটি অনুকূল করতে চান। একবার আপনার চেবিশেভ বহুবর্ষ হয়ে গেলে, আপনি রাউন্ডিং ত্রুটির জন্য সীমা নির্ধারণ করতে পারেন। বলুন চ (এক্স) আপনার ফাংশন, পি (এক্স) হ'ল বহুপদী, এবং ই (এক্স) গোলাকার ত্রুটি। আপনি অনুকূলিত করতে চান না | f (x) - P (x) |, আপনি অনুকূলিত করতে চান | f (x) - P (x) +/- E (x) | আপনি কিছুটা পৃথক বহুবর্ষ পাবেন যা বহুবৃত্তীয় ত্রুটিগুলি যেখানে রাউন্ডিং ত্রুটিটি বেশি রয়েছে সেখানে রাখার চেষ্টা করে এবং বৃত্তাকার ত্রুটিটি যেখানে ছোট সেখানে পলিনোমিয়াল ত্রুটিগুলি কিছুটা শিথিল করে।

এগুলি আপনাকে সহজেই সর্বশেষ বিটকে প্রায় 0.55 বারের গোলাকৃতি ত্রুটিগুলি পেতে পারে, যেখানে +, -, *, / সর্বশেষ বিট থেকে প্রায় 0.50 গুণ বেশি গোল হয়েছে।


1
এটি কীভাবে কোনও পাপ (এক্স) দক্ষতার সাথে গণনা করতে পারে তার একটি দুর্দান্ত ব্যাখ্যা , তবে এটি ওপি-র প্রশ্নের উত্তর দেওয়ার মতো বলে মনে হয় না, যা বিশেষত সি লাইব্রেরি / সংকলকগণ এটি গণনা করে সে সম্পর্কে বিশেষভাবে রয়েছে ।
ইলমারি করোনেন

চেবিশেভ বহুবর্ষগুলি একটি বিরতিতে সর্বাধিক পরম মানকে হ্রাস করে, তবে তারা একটি লক্ষ্য ফাংশন এবং বহুবর্ষের মধ্যে বৃহত্তম পার্থক্যকে হ্রাস করে না। মিনিম্যাক্স বহুপদীগুলি এটি করে।
এরিক পোস্টপিসিল

9

মত ত্রিকোণমিতিক ফাংশন বিষয়ে sin(), cos(), tan()সেখানে কোনো উল্লেখ করা হয়েছে, 5 বছর পর উচ্চ মানের পরিষ্কার-পরিচ্ছন্ন ফাংশন একটি গুরুত্বপূর্ণ দিক এর: বিন্যাস হ্রাস

এর মধ্যে যে কোনও একটি কার্যক্রমে প্রাথমিক পদক্ষেপটি হল রেডিয়ানগুলিতে 2 2 π অন্তর অন্তরকে কোণকে হ্রাস করা। তবে π অযৌক্তিক এত সহজ হ্রাস যেমন x = remainder(x, 2*M_PI)ত্রুটি পরিচয় করিয়ে দেওয়া M_PIবা মেশিন পাই, এটি of এর প্রায় অনুমান π তো, কীভাবে করব x = remainder(x, 2*π)?

প্রারম্ভিক গ্রন্থাগারগুলি মানের ফলাফল দেওয়ার জন্য বর্ধিত নির্ভুলতা বা কারুকৃত প্রোগ্রামিং ব্যবহার করেছে তবে এখনও এর সীমিত সীমার মধ্যে রয়েছে double। যখন কোনও বৃহত মানটির অনুরোধ করা হয়েছিল sin(pow(2,30)), ফলাফলগুলি অর্থহীন বা 0.0সম্ভবত ত্রুটিযুক্ত পতাকা হিসাবে সেট করা হয়েছিল TLOSSযথাযথ PLOSSক্ষতি বা নির্ভুলতার আংশিক ক্ষতির মতো কিছুতে ।

Valuesπ থেকে like এর মতো ব্যবধানে বড় মূল্যগুলির ভাল পরিসীমা হ্রাস একটি চ্যালেঞ্জিং সমস্যা যা sin()নিজেই যেমন বেসিক ট্রিগ ফাংশনের চ্যালেঞ্জগুলির প্রতিদ্বন্দ্বী ।

একটি ভাল প্রতিবেদন হ'ল বিশাল আর্গুমেন্টের জন্য যুক্তি হ্রাস: শেষ পর্যন্ত ভাল (1992)। এটা তোলে ঘটনাকে ঠিকভাবে জুড়ে: প্রয়োজন আলোচনা এবং কিভাবে যে বিভিন্ন প্ল্যাটফর্মের (SPARC, পিসি, এইচপি, 30+ অন্যান্য) ছিল এবং একটি সমাধান অ্যালগরিদম জন্য মান ফলাফল দেয় উপলব্ধ সব double থেকে -DBL_MAXকাছে DBL_MAX


যদি মূল আর্গুমেন্টগুলি ডিগ্রীতে থাকে, তবে এটি একটি বড় মূল্য হতে পারে, fmod()উন্নত নির্ভুলতার জন্য প্রথমে ব্যবহার করুন। একটি ভাল কোনও ত্রুটিfmod() প্রবর্তন করবে এবং তাই দুর্দান্ত পরিসীমা হ্রাস সরবরাহ করবে।

// sin(degrees2radians(x))
sin(degrees2radians(fmod(x, 360.0))); // -360.0 < fmod(x,360) < +360.0

বিভিন্ন ট্রিগ পরিচয় এবং remquo()আরও উন্নতি প্রস্তাব। নমুনা: সিন্ড ()


6

গ্রন্থাগারের ফাংশনগুলির প্রকৃত বাস্তবায়ন নির্দিষ্ট সংকলক এবং / অথবা গ্রন্থাগার সরবরাহকারীর উপর নির্ভর করে। এটি হার্ডওয়্যার বা সফ্টওয়্যারে সম্পন্ন করা হোক না কেন, এটি কোনও টেলর সম্প্রসারণ হোক বা না হোক ইত্যাদি vary

আমি বুঝতে পারি যে এটি একেবারে কোনও সাহায্য নয়।


5

এগুলি সাধারণত সফ্টওয়্যারগুলিতে প্রয়োগ করা হয় এবং বেশিরভাগ ক্ষেত্রে সংশ্লিষ্ট হার্ডওয়্যার (যেটি আজেমেলি) কল ব্যবহার করবে না। যাইহোক, জেসন হিসাবে উল্লেখ করেছেন, এগুলি বাস্তবায়ন নির্দিষ্ট specific

নোট করুন যে এই সফ্টওয়্যার রুটিনগুলি সংকলক উত্সগুলির অংশ নয়, বরং এটি GNU সংকলকটির জন্য ক্লাইব, বা গ্লিব্যাকের মতো করপাস লাইব্রেরিতে পাওয়া যাবে। Http://www.gnu.org/software/libc/manual/html_mono/libc.html# ট্রিগ- ফাংশন দেখুন

আপনি যদি আরও বেশি নিয়ন্ত্রণ চান তবে আপনার ঠিক কী প্রয়োজন তা যত্ন সহকারে মূল্যায়ন করা উচিত। কিছু সাধারণ পদ্ধতি হ'ল লুক-আপ টেবিলগুলির বিভাজন, সমাবেশ আহ্বান (যা প্রায়শই ধীর হয়) বা বর্গমূলের নিউটন-রাফসনের মতো অন্যান্য আনুমানিক স্কিম।


5

আপনি যদি হার্ডওয়্যার নয়, সফ্টওয়্যারটিতে একটি বাস্তবায়ন চান তবে এই প্রশ্নের সুনির্দিষ্ট উত্তর খুঁজতে যাওয়ার জায়গাটি হ'ল সংখ্যাসূচক রেসিপিগুলির অধ্যায় 5 । আমার অনুলিপি একটি বাক্সে রয়েছে, তাই আমি বিশদটি দিতে পারি না, তবে সংক্ষিপ্ত সংস্করণটি (যদি আমি এই অধিকারটি মনে করি) তা হ'ল আপনি tan(theta/2)নিজের আদিম ক্রিয়াকলাপ হিসাবে গ্রহণ করেন এবং সেখান থেকে অন্যদের গণনা করুন। গণনাটি একটি সিরিজের আনুমানিক সাথে সম্পন্ন হয় তবে এটি টেলর সিরিজের চেয়ে অনেক দ্রুত রূপান্তরিত করে conver

দুঃখিত, আমি বইটিতে আমার হাত না পেয়ে আরও কিছু মনে করতে পারছি না।


5

উত্সটিতে আঘাত করা এবং সাধারণভাবে ব্যবহৃত লাইব্রেরিতে কেউ কীভাবে এটি করেছে তা দেখার মতো কিছুই নেই; আসুন বিশেষত একটি সি গ্রন্থাগার বাস্তবায়ন তাকান। আমি uLibC বেছে নিয়েছি।

এখানে পাপ কাজ:

http://git.uclibc.org/uClibc/tree/libm/s_sin.c

যা দেখে মনে হচ্ছে এটি কয়েকটি বিশেষ কেস পরিচালনা করে এবং তারপরে ইনপুটটি মানচিত্রের জন্য [-pi / 4, pi / 4], (যুক্তিকে দুটি অংশে বিভক্ত করে, একটি বড় অংশ এবং একটি লেজ) কিছুটা যুক্তি হ্রাস করে) ফোন করার আগে

http://git.uclibc.org/uClibc/tree/libm/k_sin.c

যা তখন সেই দুটি অংশে কাজ করে। যদি কোনও লেজ না থাকে তবে 13 ডিগ্রির বহুবচন ব্যবহার করে একটি আনুমানিক উত্তর উত্পন্ন হয় a যদি একটি লেজ থাকে তবে আপনি নীতির ভিত্তিতে একটি ছোট সংশোধনমূলক সংযোজন পাবেনsin(x+y) = sin(x) + sin'(x')y


4

যখনই এই জাতীয় কোনও ক্রিয়াকলাপটি মূল্যায়ন করা হয়, তখন কোনও স্তরে খুব সম্ভবত হয়:

  • মানগুলির একটি টেবিল যা আন্তঃবিবাহিত (দ্রুত, অসম্পূর্ণ প্রয়োগগুলির জন্য - যেমন কম্পিউটারের গ্রাফিক্স)
  • ধারাবাহিক মূল্যায়ন যে আকাঙ্ক্ষিত মান --- সম্ভবত র দিকে এগোয় না Clenshaw-কার্টিস মত একটি অভিনব সমচতুষ্কোণকরণ উপর ভিত্তি করে একটি টেলর সিরিজ, সম্ভাবনা বেশি কিছু।

যদি কোনও হার্ডওয়্যার সমর্থন না থাকে তবে এসই লাইব্রেরি ব্যবহার না করে সংকলক সম্ভবত সম্ভবত এসেম্বলারের কোড (কোনও ডিবাগ প্রতীক ছাড়াই) নির্গত করে পরবর্তী পদ্ধতিটি ব্যবহার করে --- এটি আপনাকে আপনার ডিবাগারে প্রকৃত কোডটি ট্র্যাক করার জন্য জটিল করে তোলে।


4

অনেকে যেমন উল্লেখ করেছেন, এটি বাস্তবায়ন নির্ভর। তবে আমি আপনার প্রশ্নটি যতটা বুঝতে পেরেছি আপনি গণিত ফাংশনগুলির বাস্তব সফ্টওয়্যার প্রয়োগে আগ্রহী ছিলেন , তবে কেবল এটির সন্ধান করতে পারেন নি। যদি এটি হয় তবে আপনি এখানে আছেন:

  • Http://ftp.gnu.org/gnu/glibc/ থেকে glibc উত্স কোড ডাউনলোড করুন
  • আনপ্যাক করা গ্লিবসি রুট \ sysdeps \ ieee754 \ dbl-64 ফোল্ডারে dosincos.cঅবস্থিত ফাইলটি দেখুন
  • একইভাবে আপনি বাকী গণিত লাইব্রেরির প্রয়োগগুলি সন্ধান করতে পারেন, উপযুক্ত নাম সহ ফাইলটি সন্ধান করুন

.tblএক্সটেনশন সহ আপনার ফাইলগুলিও দেখতে পারেন , তাদের বিষয়বস্তু বাইনারি আকারে বিভিন্ন ফাংশনের প্রাক্পম্পিউটেড মানগুলির বিশাল টেবিল ছাড়া আর কিছু নয় । এ কারণেই বাস্তবায়ন এত দ্রুত: তারা যে কোনও সিরিজ ব্যবহার করে তার সমস্ত সহগকে গণনা করার পরিবর্তে তারা কেবল একটি দ্রুত অনুসন্ধান করে, যা অনেক দ্রুত। বিটিডাব্লু, তারা সাইন এবং কোসাইন গণনা করার জন্য টেইলর সিরিজ ব্যবহার করে।

আশা করি এটা কাজে লাগবে.


4

আমি sin()একটি সি প্রোগ্রামের ক্ষেত্রে জিসিসির সি সংকলককে একটি বর্তমান এক্স ৮86 process প্রসেসরের সংকলিত (জেনে নেওয়া যাক একটি ইন্টেল কোর 2 দুয়ো) এর জবাব দেওয়ার চেষ্টা করব ।

সি ভাষায় স্ট্যান্ডার্ড সি লাইব্রেরিতে সাধারণ গণিতের ক্রিয়াকলাপ অন্তর্ভুক্ত থাকে, যা ভাষা নিজেই অন্তর্ভুক্ত থাকে না (যেমন pow, sinএবং cosযথাক্রমে শক্তি, সাইন এবং কোসাইন) ine যার শিরোনামগুলি গণিতের অন্তর্ভুক্ত ।

এখন একটি জিএনইউ / লিনাক্স সিস্টেমে এই লাইব্রেরি ফাংশনগুলি গ্লিবসি (জিএনইউ লিবিসি বা জিএনইউ সি লাইব্রেরি) সরবরাহ করে। তবে জিসিসি সংকলক এই গণিত ফাংশনগুলির ব্যবহার সক্ষম করতে আপনি সংকলক পতাকা ব্যবহার করে গণিতের লাইব্রেরি ( libm.so) এর সাথে লিঙ্ক করতে চান -lmআমি নিশ্চিত না কেন এটি স্ট্যান্ডার্ড সি লাইব্রেরির অংশ নয়। এগুলি ভাসমান পয়েন্ট ফাংশনগুলির একটি সফ্টওয়্যার সংস্করণ বা "নরম-ফ্লোট" হবে।

একপাশে: ম্যাথ ফাংশন আলাদা থাকার কারণটা ঐতিহাসিক, এবং নিছক মধ্যে এক্সিকিউটেবল প্রোগ্রাম আকার হ্রাস জন্যই ছিল খুব পুরোনো ইউনিক্স সিস্টেম, সম্ভবত আগে শেয়ার করা লাইব্রেরির উপলব্ধ ছিল, আমি জানি যতদূর।

সংকলকটি আপনার সিপিইউ / এফপিইউ-র অন্তর্নির্মিত পাপ () ফাংশনটির স্থানীয় নির্দেশের কল দিয়ে প্রতিস্থাপনের জন্য স্ট্যান্ডার্ড সি লাইব্রেরি ফাংশন sin()(সরবরাহিত libm.so)টিকে অনুকূল করতে পারে যা এফপিইউ নির্দেশিকা হিসাবে উপস্থিত রয়েছে (FSIN x86 / x87 এর জন্য) কোর 2 সিরিজের মতো নতুন প্রসেসর (এটি আই 486 ডিএক্স হিসাবে অনেক পিছনে সঠিক)। এটি জিসিসি সংকলককে দেওয়া অপ্টিমাইজেশন ফ্ল্যাগগুলির উপর নির্ভর করবে। যদি সংকলকটিকে কোনও কোড লিখতে বলা হয়েছিল যা কোনও i386 বা নতুন প্রসেসরের উপর চালিত হবে, তবে এটি এমন একটি অপ্টিমাইজেশন তৈরি করবে না। -mcpu=486পতাকা কম্পাইলার অবহিত করবে এটা যেমন একটি অপ্টিমাইজেশান করতে নিরাপদ ছিল।

এখন যদি প্রোগ্রাম পাপ () ফাংশনের সফটওয়্যার সংস্করণ মৃত্যুদন্ড কার্যকর, তাই একটি উপর ভিত্তি করে করতে হবে CORDIC (তুল্য ঘূর্ণন ডিজিটাল কম্পিউটার) অথবা BKM অ্যালগরিদম , বা আরো সম্ভবত একটি টেবিল বা ক্ষমতা-সিরিজ হিসাব যা সাধারণভাবে গণনা করতে এখন ব্যবহৃত হয় যেমন স্বতন্ত্র কাজ। [Src: http://en.wikedia.org/wiki/Cordic# প্রয়োগ]

জিসিসি-র কোনও সাম্প্রতিক (২.৯x পূর্ববর্তী।) সংস্করণে পাপের একটি অন্তর্নির্মিত সংস্করণও সরবরাহ করা হয়েছে, __builtin_sin() এটি সিটি লাইব্রেরি সংস্করণে স্ট্যান্ডার্ড কলটিকে একটি অপ্টিমাইজেশন হিসাবে প্রতিস্থাপন করবে।

আমি নিশ্চিত যে এটি কাদা হিসাবে পরিষ্কার, তবে আশা করি আপনি প্রত্যাশার চেয়ে আরও তথ্য এবং নিজেকে আরও শিখার জন্য প্রচুর পয়েন্ট ঝাঁপিয়ে পড়ে।



3

টেলর সিরিজ ব্যবহার করবেন না। উপরের দু'জন লোক দেখিয়েছেন, চেবিশেভ বহুবর্ষগুলি দ্রুত এবং আরও সঠিক both এখানে একটি বাস্তবায়ন রয়েছে (মূলত জেডএক্স স্পেকট্রাম রম থেকে): https://albertveli.wordpress.com/2015/01/10/zx-sine/


2
এটি সত্যই জিজ্ঞাসা করা প্রশ্নের উত্তর বলে মনে হচ্ছে না। ওপি জিজ্ঞাসা করছে কিভাবে ট্রিগার কাজ করে হয় সাধারণ সি কম্পাইলার / লাইব্রেরি নির্ণিত (এবং আমি নিশ্চিত ZX স্পেকট্রাম যোগ্যতা অর্জন করে না আছি) যে, তা কিভাবে না করা উচিত গণনা করা। যদিও এটি পূর্বের কয়েকটি উত্তর সম্পর্কে দরকারী মন্তব্য হতে পারে ।
ইলমারি করোনেন

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

2

টেইলর সিরিজটি ব্যবহার করে কোডের মাধ্যমে সাইন / কোসাইন / ট্যানজেন্ট গণনা করা খুব সহজ। নিজের লেখার ক্ষেত্রে 5 সেকেন্ডের মতো সময় লাগে।

এই সমীকরণের সাথে পুরো প্রক্রিয়াটি এখানে সংক্ষিপ্ত করা যেতে পারে:

পাপ এবং ব্যয় প্রসার

আমি সি এর জন্য লিখেছিলাম এমন কিছু রুটিন এখানে দেওয়া হল:

double _pow(double a, double b) {
    double c = 1;
    for (int i=0; i<b; i++)
        c *= a;
    return c;
}

double _fact(double x) {
    double ret = 1;
    for (int i=1; i<=x; i++) 
        ret *= i;
    return ret;
}

double _sin(double x) {
    double y = x;
    double s = -1;
    for (int i=3; i<=100; i+=2) {
        y+=s*(_pow(x,i)/_fact(i));
        s *= -1;
    }  
    return y;
}
double _cos(double x) {
    double y = 1;
    double s = -1;
    for (int i=2; i<=100; i+=2) {
        y+=s*(_pow(x,i)/_fact(i));
        s *= -1;
    }  
    return y;
}
double _tan(double x) {
     return (_sin(x)/_cos(x));  
}

4
এটি বরং একটি খারাপ বাস্তবায়ন কারণ এটি ব্যবহার করে না যে সাইন এবং কোসাইন সিরিজের ধারাবাহিক পদগুলির খুব সাধারণ কোটেন্ট রয়েছে। যার অর্থ যে কেউ এখানে ও (এন ^ 2) থেকে ও (এন) এ গুণ এবং বিভাগের সংখ্যা হ্রাস করতে পারে। অর্ধবৃত্তকরণ এবং স্কোয়ারিংয়ের মাধ্যমে আরও হ্রাস পাওয়া যায় যেমন এটি বিসি (পসিক্স মাল্টিপ্রেসিশন ক্যালকুলেটর) গণিত লাইব্রেরিতে করা হয়।
লুৎজ লেহমান

2
এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দিবে বলে মনে হয় না; ওপি জিজ্ঞাসা করছে যে কীভাবে সাধারণ সি সংকলক / গ্রন্থাগারগুলি দ্বারা ট্রিগ ফাংশন গণনা করা হয়, কাস্টম রিম্পিমুলেশনগুলির জন্য নয়।
ইলমারি করোনেন

2
আমি মনে করি এটি একটি ভাল উত্তর হিসাবে এটি প্রশ্নের আত্মার উত্তর দেয় যা পাপ () এর মতো অন্যথায় "ব্ল্যাক বক্স" ফাংশন সম্পর্কে কৌতূহল (এবং আমি অবশ্যই অনুমান করতে পারি)। এটি এখানে কেবলমাত্র উত্তর যা কিছু অপ্টিমাইজড সি উত্স কোড না পড়ার চেয়ে কয়েক সেকেন্ডের মধ্যে এটি চকচকে করে কী ঘটছে তা দ্রুত বুঝতে একটি সুযোগ দেয়।
মাইক এম

প্রকৃতপক্ষে গ্রন্থাগারগুলি আরও বেশি অনুকূলিত সংস্করণ ব্যবহার করে, এটি বুঝতে পেরে যে আপনার একবার শব্দ থাকলে আপনি কয়েকটি মানকে গুণিয়ে পরবর্তী শব্দটি পেতে পারেন। ব্লাইন্ডির উত্তরে একটি উদাহরণ দেখুন । আপনি বারবার শক্তি এবং
কল্পকাহিনী


0

ব্লাইন্ডির উত্তর থেকে কোডের উন্নত সংস্করণ

#define EPSILON .0000000000001
// this is smallest effective threshold, at least on my OS (WSL ubuntu 18)
// possibly because factorial part turns 0 at some point
// and it happens faster then series element turns 0;
// validation was made against sin() from <math.h>
double ft_sin(double x)
{
    int k = 2;
    double r = x;
    double acc = 1;
    double den = 1;
    double num = x;

//  precision drops rapidly when x is not close to 0
//  so move x to 0 as close as possible
    while (x > PI)
        x -= PI;
    while (x < -PI)
        x += PI;
    if (x > PI / 2)
        return (ft_sin(PI - x));
    if (x < -PI / 2)
        return (ft_sin(-PI - x));
//  not using fabs for performance reasons
    while (acc > EPSILON || acc < -EPSILON)
    {
        num *= -x * x;
        den *= k * (k + 1);
        acc = num / den;
        r += acc;
        k += 2;
    }
    return (r);
}

0

এটি কীভাবে কাজ করে তার সারমর্মটি জেরাল্ড হুইটলির প্রয়োগকৃত সংখ্যাসূচক বিশ্লেষণের এই অংশে রয়েছে :

যখন আপনার সফ্টওয়্যার প্রোগ্রাম কম্পিউটারটিকে একটি মান এখানে চিত্র বর্ণনা লিখুনবা জিজ্ঞাসা করতে বলে এখানে চিত্র বর্ণনা লিখুন, আপনি কি ভেবে দেখেছেন যে যদি এটি সবচেয়ে শক্তিশালী ফাংশনগুলি গণনা করতে পারে তবে এটি মানগুলি কীভাবে পেতে পারে? এটি টেবিলগুলিতে দেখে না এবং বিচ্ছিন্ন হয়ে যায়! বরং কম্পিউটারটি কিছু বহুবচন থেকে বহুবচন ব্যতীত অন্যান্য প্রতিটি ক্রিয়াকলাপকে প্রায় মানিয়ে দেয় যা মানগুলি খুব নির্ভুলভাবে দিতে প্রস্তুত হয়।

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


-1

আপনি যদি চান sinতাহলে

 __asm__ __volatile__("fsin" : "=t"(vsin) : "0"(xrads));

আপনি যদি চান cosতাহলে

 __asm__ __volatile__("fcos" : "=t"(vcos) : "0"(xrads));

আপনি যদি চান sqrtতাহলে

 __asm__ __volatile__("fsqrt" : "=t"(vsqrt) : "0"(value));

সুতরাং মেশিনের নির্দেশাবলী যখন করবে তখন কেন ভুল কোড ব্যবহার করবেন?


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