পাপ এবং কোস একসাথে গণনা করার দ্রুততম উপায় কী?


100

আমি একটি মানের সাইন এবং কো-সাইন উভয়কে একসাথে গণনা করতে চাই (উদাহরণস্বরূপ একটি রোটেশন ম্যাট্রিক্স তৈরি করতে)। অবশ্যই আমি তাদের একের পর এক পৃথকভাবে গণনা করতে পারতাম a = cos(x); b = sin(x);, তবে আমি অবাক হয়েছি যে উভয় মানগুলির প্রয়োজন হলে একটি আরও দ্রুত উপায় আছে কিনা।

সম্পাদনা করুন: এখন পর্যন্ত উত্তরগুলি সংক্ষিপ্ত করতে:

  • ভ্লাদ বলেছিলেন, এখানেFSINCOSদু'জনকেইএকত্রেডাকার মতোasm কমান্ড রয়েছে(প্রায় একই সময়েFSINএকাকীকল করারজন্য)

  • ভালো লেগেছে চি খেয়াল, এই অপ্টিমাইজেশান কখনও কখনও ইতিমধ্যে কম্পাইলার দ্বারা (যখন অপ্টিমাইজেশান পতাকা ব্যবহার করে) সম্পন্ন করা হয়।

  • ক্যাফে নির্দেশিত, যে ফাংশনsincosএবংsincosfসম্ভবত উপলব্ধ এবং কেবল অন্তর্ভুক্ত দ্বারা সরাসরি কল করা যেতে পারেmath.h

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

  • জোয়েল গুডউইন বেশ ভাল নির্ভুলতার সাথে চূড়ান্তভাবে দ্রুত আনুমানিক প্রযুক্তির একটি আকর্ষণীয় পদ্ধতির সাথে যুক্ত (আমার জন্য, এটি টেবিলের সন্ধানের পরে আরও দ্রুত)


1
পাপ / কোষের স্থানীয় প্রয়োগ সম্পর্কে এই প্রশ্নটি দেখুন: স্ট্যাকওভারফ্লো
জোল গুডউইন

1
চেষ্টা sinx ~ x-x^3/6এবং cosx~1-x^2/4অনুমান হিসাবে আপনি সঠিকতা চেয়ে বেশি গতি যত্নশীল পারেন। হিসাবে আপনি সঠিকতা প্রসঙ্গে আরো ওজন করা হয় আপনি সিরিজে শর্তে জুড়তে পারেন ( en.wikipedia.org/wiki/Taylor_series টেলর সিরিজ ত্রিকোণমিতি নিচে স্ক্রোল করুন।) লক্ষ করুন এই একটি সাধারণ ভাবে কোন ফাংশন আপনি চান যে differntiable হয় আনুমানিক হয় nবার। সুতরাং আপনার যদি এমন কোনও বৃহত ফাংশন থাকে যা সাইন এবং কোসাইন আপনার অন্তর্ভুক্ত হয় তবে আপনি যদি পাপটির পরিবর্তে আনুমানিক হন তবে এটি স্বাধীনভাবে হবে cos
ldog

এটি খুব খারাপ নির্ভুলতার সাথে দরিদ্র কৌশল। জোয়েল গুডউইনের পোস্ট দেখুন। নীচে টেলর সিরিজ পোস্ট করা হয়েছে। একটি উত্তর হিসাবে এটি পোস্ট করুন।
ড্যানভিল

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

উত্তর:


52

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

এটি একটি ছোট উদাহরণ: http://home.broadpark.no/~alein/fsincos.html

এখানে আরও একটি উদাহরণ রয়েছে (এমএসভিসির জন্য): http://www.codeguru.com/forum/showthread.php?t=328669

এখানে আরও একটি উদাহরণ রয়েছে (জিসিসি সহ): http://www.allegro.cc/forums/thread/588470

আশা করি তাদের মধ্যে কেউ সাহায্য করবে। (আমি এই নির্দেশটি নিজে ব্যবহার করিনি, দুঃখিত।)

যেহেতু তারা প্রসেসর স্তরে সমর্থিত, আমি আশা করি তারা টেবিল দেখার চেয়ে অনেক দ্রুত হবে।

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

সম্পাদনা:
ইন্টেলের ডকুমেন্টেশন বলে যে FSINCOSহয় মাত্র 5 গুন তুলনায় ধীর FDIV(অর্থাত, ফ্লোটিং পয়েন্ট বিভাগ)।

সম্পাদনা করুন:
দয়া করে নোট করুন যে সমস্ত আধুনিক সংকলক সাইন এবং কোসাইন গণনা কলকে কল করে না FSINCOS। বিশেষত, আমার ভিএস 2008 এটি সেভাবে করেনি।

সম্পাদনা:
প্রথম উদাহরণ লিঙ্কটি মারা গেছে তবে ওয়েব্যাক মেশিনে এখনও একটি সংস্করণ রয়েছে


1
@ ফকাহেলার: এটি দুর্দান্ত হবে। এই জাতীয় অপ্টিমাইজেশনটি আধুনিক সংকলকরা ব্যবহার করেছেন কিনা তা জানেন না।
ভ্লাদ

12
fsincosনির্দেশ হয় না "বেশ দ্রুত"। ইন্টেলের নিজস্ব অপ্টিমাইজেশান ম্যানুয়াল এটিকে সাম্প্রতিক মাইক্রো-আর্কিটেকচারে 119 এবং 250 চক্রের মধ্যে আবশ্যক হিসাবে উদ্ধৃত করেছে। ইন্টেলের গণিত গ্রন্থাগার (আইসিসির সাথে বিতরণ) তুলনা করে আলাদাভাবে গণনা করতে পারে sinএবং cos১০০ এরও কম চক্রের মধ্যে একটি সফ্টওয়্যার বাস্তবায়ন ব্যবহার করতে পারে যা এক্স ৮87 ইউনিটের পরিবর্তে এসএসই ব্যবহার করে। একই ধরণের সফ্টওয়্যার বাস্তবায়ন যা একই সাথে উভয়কে গণনা করা দ্রুততর হতে পারে।
স্টিফেন ক্যানন

2
@ ভ্লাদ: আইসিসি গণিতের পাঠাগারগুলি ওপেন সোর্স নয় এবং এগুলি পুনরায় বিতরণের জন্য আমার কাছে লাইসেন্স নেই, তাই আমি সমাবেশটি পোস্ট করতে পারি না। আমি আপনাকে বলতে পারি যে তাদের কোনও sinসুবিধা নেওয়ার জন্য কোনও অন্তর্নির্মিত গণনা নেই ; তারা অন্য সবার মতো একই এসএসই নির্দেশাবলী ব্যবহার করে। আপনার দ্বিতীয় মন্তব্যে, গতি আপেক্ষিক fdiv; যদি কিছু করার দুটি উপায় থাকে এবং একটি অন্যটির থেকে দ্বিগুণ দ্রুত হয় তবে ধীরে ধীরে একে "দ্রুত" বলা কোনও অর্থ নয়, এটি কোনও সম্পূর্ণ সম্পর্কহীন কাজের তুলনায় কতক্ষণ সময় নেয় তা নির্বিশেষে।
স্টিফেন ক্যানন

1
sinতাদের লাইব্রেরিতে সফ্টওয়্যার ফাংশনটি সম্পূর্ণ ডাবল-যথার্থ নির্ভুলতা সরবরাহ করে। fsincosনির্দেশ কিছুটা সঠিকতা (ডাবল প্রসারিত) বিতরণ, কিন্তু যে অতিরিক্ত সঠিকতা সবচেয়ে প্রোগ্রাম কল যে দূরে নিক্ষিপ্ত পরার sin, ফাংশন হিসেবে তার ফলাফলের সাধারণত পরে গাণিতিক অপারেশন বা মেমরি করার জন্য একটি দোকান দ্বারা ডবল স্পষ্টতা বৃত্তাকার হয়। বেশিরভাগ পরিস্থিতিতে, তারা ব্যবহারিক ব্যবহারের জন্য একই নির্ভুলতা সরবরাহ করে।
স্টিফেন ক্যানন

4
এটি নিজেও fsincosসম্পূর্ণ বাস্তবায়ন নয়; fsincosনির্দেশের জন্য যুক্তিটি বৈধ ইনপুট পরিসরে রাখার জন্য আপনার অতিরিক্ত পরিসীমা হ্রাসের পদক্ষেপ দরকার । গ্রন্থাগার sinএবং cosফাংশনগুলির মধ্যে এই হ্রাসের পাশাপাশি মূল গণনাও অন্তর্ভুক্ত রয়েছে, সুতরাং আমি তালিকাভুক্ত চক্রের সময়গুলির তুলনায় এগুলি আরও দ্রুত (তুলনা করে) সুস্পষ্ট।
স্টিফেন ক্যানন

39

আধুনিক x86 প্রসেসরের একটি fsincos নির্দেশনা রয়েছে যা আপনি যা চাইছেন ঠিক তা করবে - একই সাথে পাপ এবং কোস গণনা করুন। ভাল অপটিমাইজিং সংকলককে এমন কোড সনাক্ত করতে হবে যা একই মানের জন্য পাপ এবং কোস গণনা করে এবং এটি কার্যকর করতে fsincos কমান্ড ব্যবহার করে।

এটি কাজ করার জন্য সংকলক পতাকাগুলির কিছুটা ঝাঁকুনি নিয়েছিল, কিন্তু:

$ gcc --version
i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5488)
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cat main.c
#include <math.h> 

struct Sin_cos {double sin; double cos;};

struct Sin_cos fsincos(double val) {
  struct Sin_cos r;
  r.sin = sin(val);
  r.cos = cos(val);
  return r;
}

$ gcc -c -S -O3 -ffast-math -mfpmath=387 main.c -o main.s

$ cat main.s
    .text
    .align 4,0x90
.globl _fsincos
_fsincos:
    pushl   %ebp
    movl    %esp, %ebp
    fldl    12(%ebp)
    fsincos
    movl    8(%ebp), %eax
    fstpl   8(%eax)
    fstpl   (%eax)
    leave
    ret $4
    .subsections_via_symbols

তদা, এটি fsincos নির্দেশ ব্যবহার করে!


এই দুর্দান্ত! আপনি কী ব্যাখ্যা করতে পারবেন -mfpmath = 387 করছে? এবং এটি কি এমএসভিসির সাথেও কাজ করে?
ড্যানভিল

1
এটি দ্রষ্টব্য -ffast-mathএবং -mfpmathকিছু ক্ষেত্রে বিভিন্ন ফলাফল হতে পারে।
দেবিলেস্কি

3
mfpmath = 387 এসিসি নির্দেশাবলীর পরিবর্তে gcc কে x87 নির্দেশাবলী ব্যবহার করতে বাধ্য করবে। আমার সন্দেহ হয় এমএসভিসির অনুরূপ অপ্টিমাইজেশন এবং পতাকা রয়েছে তবে আমার কাছে নিশ্চিত হতে এমএসভিসি সুবিধাজনক নয়। X87 নির্দেশাবলী ব্যবহার করা সম্ভবত অন্যান্য কোডে সম্পাদনের জন্য ক্ষতিকারক হতে পারে যদিও, আপনারও আমার অন্য উত্তরটি দেখতে হবে, ইন্টেলের এমকেএল ব্যবহার করতে হবে।
চি

Cygwin থেকে আমার পুরোনো জিসিসি 3.4.4 2 পৃথক কল উত্পাদন করে fsinএবং fcos। :-(
ভ্লাদ

সর্বোচ্চ অপ্টিমাইজেশান সক্ষম সহ ভিজ্যুয়াল স্টুডিও ২০০ Stud দিয়ে চেষ্টা করা। এটি 2 গ্রন্থাগার ফাংশন __CIsinএবং __CIcos
ভ্লাদ

13

যখন আপনার পারফরম্যান্সের দরকার হয়, আপনি একটি পূর্বনির্ধারিত সিন / কোস টেবিল ব্যবহার করতে পারেন (একটি টেবিলটি অভিধান হিসাবে সঞ্চিত থাকে)। ঠিক আছে, এটি আপনার প্রয়োজনীয় নির্ভুলতার উপর নির্ভর করে (সম্ভবত টেবিলটি বড় হবে), তবে এটি সত্যই দ্রুত হওয়া উচিত।


তারপরে ইনপুট মানটি [0,2 * পিআই] (অথবা অতিরিক্ত চেক সহ ছোট) এ ম্যাপ করা দরকার এবং fmod এ এই কলটি কর্মক্ষমতা দূরে খায়। আমার (প্রস্তাবিত suboptimal) বাস্তবায়নে আমি চেহারা টেবিল দিয়ে পারফরম্যান্স অর্জন করতে পারিনি। আপনি এখানে কোন পরামর্শ আছে?
ড্যানভিল

11
একটি প্রাক্পম্পিউটেড টেবিলটি কেবলমাত্র কল করার চেয়ে ধীরে ধীরে ধীরে ধীরে থাকবে sinকারণ প্রম্পম্পিউটেড টেবিলটি ক্যাশে ট্র্যাশ করবে।
Andreas Brinck

1
এটি নির্ভর করে টেবিলটি কত বড়। একটি 256-এন্ট্রি টেবিলটি প্রায়শই যথেষ্ট যথাযথভাবে নির্ভুল হয় এবং এটি কেবল 1 কেবি ব্যবহার করে ... আপনি যদি এটি ব্যবহার করেন তবে এটি অ্যাপের বাকী পারফরম্যান্সকে বিরূপ প্রভাবিত না করে ক্যাশে আটকা পড়ে না?
মিঃ বয়

@Danvil: এখানে একটি সাইন লুকআপ টেবিল একটি উদাহরণ en.wikipedia.org/wiki/Lookup_table#Computing_sines । তবে এটি ধরে নিয়েছে যে আপনি ইতিমধ্যে আপনার ইনপুটটিকে [0; 2 পিআই] তেও ম্যাপ করেছেন।
টানাশিয়াস

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

13

প্রযুক্তিগতভাবে, আপনি জটিল সংখ্যা এবং এলারের সূত্র ব্যবহার করে এটি অর্জন করবেন । সুতরাং, (সি ++) এর মতো কিছু

complex<double> res = exp(complex<double>(0, x));
// or equivalent
complex<double> res = polar<double>(1, x);
double sin_x = res.imag();
double cos_x = res.real();

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


সম্পাদন করা

মধ্যে হেডার <complex>গনুহ সি ++ 4.2 জন্য স্পষ্ট গণনার ব্যবহার করছেন sinএবং cosভিতরে polar, তাই এটি optimisations জন্য খুব ভাল দেখাচ্ছে না সেখানে যদি না কম্পাইলার কিছু যাদু আছে (দেখুন -ffast-mathএবং -mfpmathযেমন লেখা পরিবর্তন চি এর উত্তর )।


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

12

আপনি কোনওটি গণনা করতে পারেন এবং তারপরে পরিচয়টি ব্যবহার করতে পারেন:

cos (x) 2 = 1 - sin (x) 2

তবে @ ট্যানাসিসিয়াস যেমন বলেছে, একটি পূর্বনির্ধারিত টেবিল হ'ল উপায়।


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

4
sqrt()হার্ডওয়্যারে প্রায়শই অপ্টিমাইজ করা হয়, সুতরাং এটি তখন খুব দ্রুত sin()বা তত দ্রুত হতে পারে cos()। শক্তিটি কেবলমাত্র স্বয়ং গুণক, সুতরাং ব্যবহার করবেন না pow()। হার্ডওয়্যার সমর্থন ছাড়াই খুব দ্রুত যুক্তিসঙ্গতভাবে সঠিক স্কোয়ার-শিকড় পাওয়ার জন্য কিছু কৌশল রয়েছে। শেষ অবধি, এগুলির যে কোনও একটি করার আগে অবশ্যই প্রোফাইলটি নিশ্চিত করুন।
deft_code

12
মনে রাখবেন যে পাপ এক্স সরাসরি গণনা করার চেয়ে √ (1 - কোস ^ 2 এক্স) কম সঠিক, বিশেষত যখন x ~ 0
কেনেটিএম

1
ছোট x এর জন্য y = sqrt (1-x * x) এর জন্য টেলর সিরিজটি খুব সুন্দর। আপনি প্রথম 3 টি শর্তাদির সাথে ভাল নির্ভুলতা পেতে পারেন এবং এটির জন্য কেবল কয়েকটি গুণক এবং একটি শিফ্টের প্রয়োজন। আমি এটি নির্দিষ্ট পয়েন্ট কোড ব্যবহার করেছি।
phkahler

1
@ এফকাহেলার: আপনার টেলর সিরিজটি প্রযোজ্য নয় কারণ যখন x ~ 0, কারণ x ~ 1.
কেনেটিএম

10

আপনি যদি জিএনইউ সি লাইব্রেরি ব্যবহার করেন তবে আপনি এটি করতে পারেন:

#define _GNU_SOURCE
#include <math.h>

এবং আপনার ঘোষণা পাবেন sincos(), sincosf()এবং sincosl()আপনার টার্গেট আর্কিটেকচারের জন্য দ্রুততম ভাবে সম্ভবতঃ - ফাংশন উভয় মান একসঙ্গে নিরূপণ।


8

এই ফোরাম পৃষ্ঠায় খুব আকর্ষণীয় স্টাফ রয়েছে, যা দ্রুত খুব ভাল অনুমানের সন্ধানে দৃষ্টি নিবদ্ধ করে: http://www.devmaster.net/forums/showthread.php?t=5784

দাবি অস্বীকার: আমি নিজে এই জিনিসগুলির কোনও ব্যবহার করি না।

আপডেট 22 ফেব্রুয়ারী 2018: ওয়েবেব্যাক মেশিন এখন আসল পৃষ্ঠাটি দেখার একমাত্র উপায়: https://web.archive.org/web/20130927121234/http://devmaster.net/posts/9648/ ব্রেকফাস্ট-and-accurate- সাইন-কোসাইন


আমি এটির চেষ্টাও করেছি, এবং এটি আমাকে বেশ ভাল অভিনয় দিয়েছে। তবে পাপ এবং কোস স্বাধীনভাবে গণনা করা হয়।
ড্যানভিল

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

সরাসরি নয় (প্রশ্নটি ঠিক এই জিজ্ঞাসা করা সত্ত্বেও)। আমার পাপের এবং মূল্যমান x এর দরকার আছে এবং এটি জানা উপায় নেই যে অন্য কোনও জায়গায় আমি কাকতালীয়ভাবে x + pi / 2 গণনা করেছি ...
ড্যানভিল

আমি আমার গেমটিতে এটি কণার বৃত্ত আঁকতে ব্যবহার করেছি। যেহেতু এটি কেবলমাত্র একটি চাক্ষুষ প্রভাব, ফলাফল যথেষ্ট কাছাকাছি, এবং পারফোলেন্স সত্যই চিত্তাকর্ষক।
ম্যাক্সিম কমলভ

আমি খুশি হতে পারিনি; চেবিশেভ আনুমানিকতা সাধারণত প্রদত্ত পারফরম্যান্সের জন্য আপনাকে সবচেয়ে নির্ভুলতা দেয়।
জেসন এস

7

অনেক সি গণিত গ্রন্থাগার, যেমন ক্যাফ নির্দেশ করে, ইতিমধ্যে সিনকোস () রয়েছে। উল্লেখযোগ্য ব্যতিক্রম এমএসভিসি।

  • কমপক্ষে 1987 সাল থেকে সূর্যের সিনকোস ছিল (তেইশ বছর; আমার একটি হার্ড-কপি ম্যান পৃষ্ঠা রয়েছে)
  • HPUX 11 এর 1997 সালে ছিল (তবে এইচপুক 10.20 এ নেই)
  • 2.1 সংস্করণ (ফেব্রুয়ারী 1999) এ গ্লিবসি-তে যুক্ত হয়েছে
  • জিসিসি 3.4 (2004) এ অন্তর্নির্মিত হয়েছেন, __ বিল্টিন_সিনকোস ()।

এবং চেহারা সম্পর্কে, এরিক এস রেমন্ড আর্ট অফ ইউনিক্স প্রোগ্রামিং (2004) (অধ্যায় 12) স্পষ্টতই এটিকে একটি খারাপ ধারণা বলেছেন (বর্তমান মুহুর্তে):

"আরেকটি উদাহরণ ছোট টেবিলগুলি পূর্বাভাস দেওয়া - উদাহরণস্বরূপ, 3 ডি গ্রাফিক্স ইঞ্জিনে আবর্তনের অনুকূলকরণের জন্য ডিগ্রি দ্বারা পাপের (x) টেবিলটি একটি আধুনিক মেশিনে 365 × 4 বাইট লাগবে Before , এটি একটি স্পষ্ট গতি অপ্টিমাইজেশন ছিল Now আজকাল টেবিলের কারণে অতিরিক্ত ক্যাশে মিসের শতাংশের জন্য অর্থ প্রদানের পরিবর্তে প্রতিবার পুনরায় সংশোধন করা আরও দ্রুত হতে পারে।

"তবে ভবিষ্যতে, ক্যাচগুলি বড় হওয়ার সাথে সাথে এটি আবার ঘুরে দাঁড়াবে More ( আর্ট অফ ইউনিক্স প্রোগ্রামিং থেকে )

তবে, উপরের আলোচনা থেকে বিচার করা, সবাই একমত নয়।


10
"365 x 4 বাইট"। আপনার লিপ বছরের জন্য অ্যাকাউন্ট করতে হবে, যাতে এটি আসলে 365.25 x 4 বাইট হওয়া উচিত। অথবা তিনি বোঝাতে চেয়েছিলেন যে কোনও পৃথিবীতে বছরের সংখ্যাগুলির পরিবর্তে একটি বৃত্তে ডিগ্রি সংখ্যা ব্যবহার করা।
পোনকডুডল

@ ওয়াল্লাকোলু: দুর্দান্ত পর্যবেক্ষণ। অামি এটি মিস করেছি. তবে ত্রুটিটি আসল
জোসেফ কুইনসে

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

5

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

তবে আমি সিনকোসের দ্রুত বাস্তবায়নের দিকে নজর রেখেছিলাম যা আপনি এএমডি এর এসিএমএল এবং ইন্টেলের এমকেএল এর মতো লাইব্রেরিতে খুঁজে পান।


3

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

এটি একটি সিনসোস ফাংশন আছে

সেই ডকুমেন্টেশন অনুসারে, উচ্চ নির্ভুলতা মোডে এটি কোর 2 দ্বীপে গড় 13.08 ঘড়ি / উপাদান রয়েছে, যা আমার ধারণা fsincos এর চেয়ে আরও দ্রুত হবে।


1
একইভাবে, উপর ওএসএক্স ব্যবহার করতে পারেন vvsincosবা vvsincosfAccelerate.framework থেকে। আমি বিশ্বাস করি যে তাদের ভেক্টর লাইব্রেরিতেও এএমডির অনুরূপ ফাংশন রয়েছে।
স্টিফেন ক্যানন

3

এই নিবন্ধটি দেখায় যে কীভাবে একটি প্যারাবোলিক অ্যালগরিদম তৈরি করতে হবে যা সাইন এবং কোসাইন উভয়ই উত্পাদন করে:

ডিএসপি ট্রিক: সিন এবং কোসের যুগপত প্যারাবোলিক অনুমান

http://www.dspguru.com/dsp/tricks/parabolic-approximation-of-sin-and-cos


1
হুমম ... আমার ও চেবিশেভ আনুমানিকের মধ্যে একটি শুটআউট করা দরকার যা আমি মনে করি জিতবে।
জেসন এস

2

যখন এই ধরণের জিনিসটির জন্য পারফরম্যান্স সমালোচনা করে তখন কোনও সারণী প্রবর্তন করা অস্বাভাবিক কিছু নয় is


2

সৃজনশীল পদ্ধতির জন্য, টেলর সিরিজটি কীভাবে প্রসারিত করবেন? যেহেতু তাদের অনুরূপ পদ রয়েছে, আপনি নিম্নলিখিত ছদ্ম মত কিছু করতে পারেন:

numerator = x
denominator = 1
sine = x
cosine = 1
op = -1
fact = 1

while (not enough precision) {
    fact++
    denominator *= fact
    numerator *= x

    cosine += op * numerator / denominator

    fact++
    denominator *= fact
    numerator *= x

    sine += op * numerator / denominator

    op *= -1
}

এর অর্থ আপনি এরকম কিছু করেন: পাপ এবং কোসাইনের জন্য x এবং 1 থেকে শুরু করে, প্যাটার্নটি অনুসরণ করুন - x ^ 2/2 বিয়োগ করুন! কোসাইন থেকে, এক্স sub 3/3 বিয়োগ করুন! সাইন থেকে, এক্স ^ 4/4 যোগ করুন! কোসিনে, এক্স ^ 5/5 যোগ করুন! সাইন ...

এই অভিনয় হবে কিনা আমার ধারণা নেই I পাপ () এবং কোস () আপনাকে প্রদত্ত তুলনায় আপনার যদি কম নির্ভুলতার প্রয়োজন হয় তবে এটি বিকল্প হতে পারে।


আসলে আই-সাইন এক্সটেনশন ফ্যাক্টরটি আই / কোসাইন এক্সটেনশন ফ্যাক্টরের x / i গুণ। তবে আমি সন্দেহ করব যে টেলর সিরিজটি ব্যবহার করা সত্যিই দ্রুত ...
ড্যানভিল

1
বহুবর্ষীয় ফাংশন আনুমানিককরণের জন্য চেবিশেভ টেলরের চেয়ে অনেক ভাল। টেলর অনুমান ব্যবহার করবেন না।
টিম্ম্ম্ম

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

2

সিইফইএস লাইব্রেরিতে একটি দুর্দান্ত সমাধান রয়েছে যা বেশ দ্রুত হতে পারে এবং আপনি কিছুটা / কম সিপিইউয়ের জন্য নির্ভুলতাটি বেশ নমনীয়ভাবে যুক্ত / সরাতে পারেন।

মনে রাখবেন কোস (এক্স) এবং পাপ (এক্স) এক্সপ (আইএক্স) এর আসল এবং কাল্পনিক অংশ। সুতরাং আমরা উভয় পেতে এক্সপ (ix) গণনা করতে চাই। 0 এবং 2pi এর মধ্যে y এর কিছু বিচ্ছিন্ন মানগুলির জন্য আমরা এক্সপ্যাক্ট (iy) প্রাক-গণনা করি। আমরা x ব্যবধানে স্থানান্তর [0, 2 পিআই)। তারপরে আমরা x এর নিকটতম y নির্বাচন করি এবং
এক্সপ্রেস (ix) = exp (iy + (ix-iy)) = Exp (iy) এক্সপ্রেস (i (xy)) লিখি।

আমরা সারণী থেকে এক্সপ্রেস (iy) পাই। এবং যেহেতু | xy | ছোট (y- মানগুলির মধ্যে প্রায় অর্ধেক দূরত্ব), টেলর সিরিজটি কেবলমাত্র কয়েকটি পদে সুন্দরভাবে রূপান্তরিত হবে, সুতরাং আমরা এটি এক্সপ্রেস (i (xy)) এর জন্য ব্যবহার করি। এবং তারপরে এক্সপ (ix) পেতে আমাদের কেবল একটি জটিল গুণকের প্রয়োজন।

এর আর একটি দুর্দান্ত সম্পত্তি হ'ল আপনি এসএসই ব্যবহার করে এটি ভেক্টরাইজ করতে পারেন।


2

আপনি http://gruntthepeon.free.fr/ssemath/ এ একবার দেখতে চান , যা সিইফইএস লাইব্রেরি থেকে অনুপ্রাণিত একটি এসএসই ভেক্টরাইজড বাস্তবায়ন সরবরাহ করে। এটির যথাযথতা (5e-8 এর ক্রমে পাপ / কোস থেকে সর্বাধিক বিচ্যুতি) এবং গতি (একক কল ভিত্তিতে fsincos সামান্য আউটফর্ম করে এবং একাধিক মানের উপরে একটি পরিষ্কার বিজয়ী) রয়েছে has



1

জাভাস্ক্রিপ্টে একসাথে পাপ এবং কোস ফাংশনের একটি সঠিক তবে দ্রুত সমীকরণ এখানে পাওয়া যাবে: http://danisraelmalta.github.io/Fmath/ (সহজেই সি / সি ++ এ আমদানি করা)


0

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


0

এমএসভিসি সংকলক (অভ্যন্তরীণ) এসএসই 2 ফাংশন ব্যবহার করতে পারে

 ___libm_sse2_sincos_ (for x86)
 __libm_sse2_sincos_  (for x64)

যথাযথ সংকলক পতাকাগুলি নির্দিষ্ট করা থাকলে অনুকূলিত বিল্ডগুলিতে (সর্বনিম্ন / ও 2 / খিলান: এসএসই 2 / এফপি: দ্রুত)। এই ফাংশনগুলির নামগুলি বোঝায় যে তারা পৃথক পাপ এবং কোস গণনা করে না, তবে উভয়ই "এক পদক্ষেপে"।

উদাহরণ স্বরূপ:

void sincos(double const x, double & s, double & c)
{
  s = std::sin(x);
  c = std::cos(x);
}

সমাবেশ (x86 এর জন্য) সাথে / এফপি: দ্রুত:

movsd   xmm0, QWORD PTR _x$[esp-4]
call    ___libm_sse2_sincos_
mov     eax, DWORD PTR _s$[esp-4]
movsd   QWORD PTR [eax], xmm0
mov     eax, DWORD PTR _c$[esp-4]
shufpd  xmm0, xmm0, 1
movsd   QWORD PTR [eax], xmm0
ret     0

সমাবেশ (x86 এর জন্য) / এফপি ছাড়াই: দ্রুত তবে / এফপি সহ: যথাযথ পরিবর্তে (যা পূর্বনির্ধারিত) পৃথক পাপ এবং কারণকে ডাকে:

movsd   xmm0, QWORD PTR _x$[esp-4]
call    __libm_sse2_sin_precise
mov     eax, DWORD PTR _s$[esp-4]
movsd   QWORD PTR [eax], xmm0
movsd   xmm0, QWORD PTR _x$[esp-4]
call    __libm_sse2_cos_precise
mov     eax, DWORD PTR _c$[esp-4]
movsd   QWORD PTR [eax], xmm0
ret     0

সুতরাং / এফপি: সিনোকোস অপ্টিমাইজেশনের জন্য দ্রুত বাধ্যতামূলক।

তবে দয়া করে নোট করুন

___libm_sse2_sincos_

সম্ভবত হিসাবে সুনির্দিষ্ট না

__libm_sse2_sin_precise
__libm_sse2_cos_precise

নামের শেষে "সুনির্দিষ্ট" অনুপস্থিত থাকার কারণে।

সর্বশেষতম এমএসভিসি 2019 সংকলক এবং উপযুক্ত অপ্টিমাইজেশনের সাথে আমার "সামান্য" পুরানো সিস্টেমে (ইন্টেল কোর 2 ডুয়ো ই 6750), আমার মানদণ্ডটি দেখায় যে সিনকোস কল পৃথক পাপ এবং কোস কলগুলির চেয়ে প্রায় 2.4 গুণ বেশি দ্রুত।

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