একজন গণ্য বিজ্ঞানীকে স্টাড :: জটিলের নিজস্ব সংস্করণটি কেন প্রয়োগ করতে হবে?


14

ইগেন , ট্রিলিনোস এবং ডিলের মতো গণ্য বিজ্ঞানের অনেক বেশি পরিচিত সি ++ গ্রন্থাগার ries আমিstd::complex<> জটিল ভাসমান-পয়েন্ট সংখ্যা উপস্থাপনের জন্য স্ট্যান্ডার্ড সি ++ টেম্পলেট শিরোনাম লাইব্রেরি অবজেক্ট ব্যবহার করি ।

জ্যাক Poulson এর দশকে উত্তর ডিফল্ট কনস্ট্রাকটর সম্পর্কে একটি প্রশ্ন তিনি তুলে ধরে সে নিজের বাস্তবায়ন আছে যা std::complexমধ্যে মৌল "কারণের একটি নম্বর জন্য"। সে কারণগুলি কী কী? এই পদ্ধতির সুবিধা এবং অসুবিধাগুলি কী কী?

উত্তর:


16

আমি বিশ্বাস করি এই আলোচনাটি পিইটিএসসি তালিকায় বেশ কয়েকবার এসেছে। আমার প্রধান কারণগুলি হ'ল:

  1. সি ++ স্ট্যান্ডার্ড জানিয়েছে যে স্টাড :: কমপ্লেক্সটি কেবল ফ্লোট, ডাবল এবং দীর্ঘ ডাবল ডেটাটাইপগুলির জন্য সংজ্ঞায়িত। সুতরাং এটি অন্যান্য ডেটাটাইপের জন্য যেমন কোয়াড-নির্ভুলতার জন্য ব্যবহার করা যায় না।

  2. মান জটিল জটিল গণিতের স্থায়িত্ব সম্পর্কে কোনও গ্যারান্টি দেয় না।

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

  4. আমি আসল এবং কল্পিত উপাদানগুলি সরাসরি পরিচালনা করতে সক্ষম হওয়া পছন্দ করি। std :: জটিল এটিকে অহেতুক কঠিন করে তোলে।

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


6
পয়েন্ট 3 সি ++ 11 এ সম্বোধন করা হয়েছে। 26.4.4 রাজ্যের যে যদি zপ্রকারের একটি lvalue অভিব্যক্তি CV std::complex<T> তারপর reinterpret_cast<cv T(&)[2]>(z)এবং reinterpret_cast<cv T(&)[2]>(z)[0]প্রকৃত অংশ মনোনীত করিবে z, এবং reinterpret_cast<cv T(&)[2]>(z)[1]এর কাল্পনিক অংশ মনোনীত করিবে z। জটিল সংখ্যার অ্যারে সম্বোধন করা হয়।
জেমস কাস্টার

3
@ জেমসকাস্টার: অবশেষে সি ++ ১১ এ স্যুইচ করার জন্য আমি সবই করছি, তবে বৈজ্ঞানিক কোডগুলি যেগুলি আধা-বহিরাগত আর্কিটেকচারে বহনযোগ্য থাকতে চায় তা করতে সম্ভবত কমপক্ষে দুই থেকে তিন বছর অপেক্ষা করতে হবে। এছাড়াও, সি ++ 11 দুর্ভাগ্যক্রমে কেবল সমস্যার অংশটিকেই সম্বোধন করে।
জ্যাক পলসন

আমি বুঝতে পারি, ভবিষ্যতে যদি কেউ এই প্রশ্নের দিকে নজর দেয় তবে আমি কেবল এটি বাইরে ফেলে দিচ্ছিলাম।
জেমস কাস্টার

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

1
@ ওল্ফগ্যাংবাংয়ের্থ: সি ++ 11 এ স্যুইচ করার বিষয়ে এটি একটি সাধারণ মন্তব্য ছিল। যেভাবেই হোক, সি ++ 11 স্ট্যান্ড :: কমপ্লেক্সের বেশিরভাগ সমস্যার সমাধান করে না।
জ্যাক পলসন

7

আমি std::complex<>আমার প্রোগ্রামগুলিতে ব্যবহার করি, এবং প্রতিটি নতুন সংকলক বা সংকলক আপগ্রেডের জন্য সংকলক পতাকাগুলি এবং workaround সহ লড়াই করতে হবে। আমি এই মারামারিগুলিকে কালানুক্রমিকভাবে গণনা করার চেষ্টা করব:

  1. std::norm|z|2|z|-ffast-math
  2. লিনাক্স (বা লিঙ্কার) এ ইন্টেল আইসিসি সংকলকটি std::argনির্দিষ্ট কনফিগারেশনের অধীনে একটি অন- অপ্টে সংকলিত (নির্দিষ্ট জিসিসি-সংস্করণের সাথে লিঙ্কের সামঞ্জস্য)। সমস্যাটি প্রায়শই পুনরায় উত্থিত হয়, তাই std::argএটি দ্বারা প্রতিস্থাপন করতে হয়েছিল atan2(imag(),real())। তবে নতুন কোড লেখার সময় এটি ভুলে যাওয়া খুব সহজ ছিল।
  3. প্রকারটি std::complexবিল্ড-ইন সি 99 জটিল ধরণের চেয়ে আলাদা কল কনভেনশন (= এবিআই) এবং নতুন জিসিসি সংস্করণগুলির জন্য বিল্ট-ইন ফোর্টরান জটিল ধরণের ব্যবহার করে।
  4. -ffast-mathঅপ্রত্যাশিতভাবে বিন্দু ব্যতিক্রম ভাসমান সামলাচ্ছে সঙ্গে কম্পাইল পতাকা মিথস্ক্রিয়া। যা ঘটে তা হ'ল সংকলকটি লুপগুলি থেকে বিভাজনগুলি টান দেয়, যার ফলে রানটাইমগুলিতে division by zeroব্যতিক্রম ঘটে। এই ব্যতিক্রমগুলি লুপের অভ্যন্তরে কখনই ঘটত না কারণ পার্শ্ববর্তী যুক্তির কারণে সংশ্লিষ্ট বিভাগটি সংঘটিত হয়নি। এটি সত্যিই খারাপ ছিল, কারণ এটি একটি লাইব্রেরি ছিল যা প্রোগ্রাম থেকে পৃথকভাবে সংকলিত হয়েছিল যা ভাসমান পয়েন্ট ব্যতিক্রম হ্যান্ডিং (বিভিন্ন সংকলন পতাকা ব্যবহার করে) ব্যবহার করে এবং এই সমস্যাগুলিতে চালিত হয় (সম্পর্কিত দলগুলি বিশ্বের বিপরীত অংশে বসে ছিল, তাই) এই সমস্যাটি সত্যই খারাপ সমস্যার কারণ হয়েছে)। এটি আরও যত্ন সহকারে সংকলক দ্বারা ব্যবহৃত অপটিমাইজেশন করে সমাধান করা হয়েছিল।
  5. গ্রন্থাগারটি প্রোগ্রামটির অংশ হয়ে গেছে এবং আর এটি -ffast-mathসংকলন পতাকা ব্যবহার করে না । একটি নতুন জিসিসি সংস্করণে আপগ্রেড হওয়ার পরে, পারফরম্যান্সটি একটি বিশাল ফ্যাক্টর দ্বারা কমেছে। আমি এখনও এই সমস্যাটি বিশদভাবে তদন্ত করি নি, তবে আমি আশঙ্কা করি এটি C99 এনেক্সেক্স জি এর সাথে সম্পর্কিত । আমাকে স্বীকার করতে হবে যে জটিল সংখ্যার জন্য গুণনের এই বিস্ময়কর সংজ্ঞায় আমি সম্পূর্ণ বিভ্রান্ত হয়েছি এবং অন্য সংস্করণগুলি ভুল পথে চালিত হয়েছে বলে দাবি করেও এর বিভিন্ন সংস্করণ উপস্থিত রয়েছে বলে মনে হয়। আমি আশা করি যে -fcx-limited-rangeসংকলন পতাকাটি সমস্যার সমাধান করবে, কারণ -ffast-mathএই নতুন জিসিসি সংস্করণটির সাথে সম্পর্কিত আরও একটি সমস্যা আছে বলে মনে হচ্ছে ।
  6. -ffast-mathকম্পাইল পতাকার আচরণ তোলে NaNজিসিসি নতুন সংস্করণের জন্য সম্পূর্ণরূপে অনিশ্চিত (এমনকি isnanপ্রভাবিত হয়)। একমাত্র NaNকর্মসূচী মনে হয় প্রোগ্রামটির কোনও ঘটনা এড়ানোর জন্য যা অস্তিত্বের উদ্দেশ্যকে পরাস্ত করে NaN

এখন আপনি জিজ্ঞাসা করতে পারেন যে আমি অন্তর্নির্মিত জটিল ধরণের এবং std::complexএই কারণগুলির জন্য পরিত্যাগ করার পরিকল্পনা করছি । আমি অন্তর্নির্মিত ধরণের সাথে থাকব, যতক্ষণ না আমি সি ++ সহ থাকি। যদি সি ++ এর জন্য বৈজ্ঞানিক কম্পিউটিংয়ের জন্য সম্পূর্ণ অপ্রয়োজনীয় হয়ে ওঠার ব্যবস্থা করা উচিত তবে আমি বরং এমন একটি ভাষায় স্যুইচ করার কথা বিবেচনা করব যা বৈজ্ঞানিক কম্পিউটিংয়ের সাথে সম্পর্কিত সমস্যাগুলির আরও যত্ন নেয় more


দেখে মনে হচ্ছে C99 এনেক্সেক্স জি সম্পর্কিত আমার ভয় সত্য হয়ে গেছে, এবং জটিল সংখ্যাগুলি গুণিত করার সময় -fcx- সীমাবদ্ধ-পরিসীমা শালীন গণনার গতির জন্য এখন প্রয়োজনীয় ধরণের। কমপক্ষে যে কি নিম্নলিখিত সাম্প্রতিক যুদ্ধ গল্প থেকে পাবেন medium.com/@smcallis_71148/...
টমাস Klimpel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.