সি ++ ফাংশনে সংখ্যাসূচক ত্রুটি বিশ্লেষণ


20

মনে করুন যে আমার একটি ফাংশন রয়েছে যা ইনপুট হিসাবে বেশ কয়েকটি ভাসমান-পয়েন্ট মান (একক বা দ্বিগুণ) নেয়, কিছু গণনা করে এবং আউটপুট ভাসমান-পয়েন্ট মান (এছাড়াও একক বা ডাবল) উত্পাদন করে। আমি প্রাথমিকভাবে এমএসভিসি ২০০৮ এর সাথে কাজ করছি, তবে মিনজিডাব্লু / জিসিসির সাথেও কাজ করার পরিকল্পনা করছি। আমি সি ++ তে প্রোগ্রামিং করছি।

ফলাফলের মধ্যে ত্রুটি কতটা প্রোগ্রামিকভাবে পরিমাপের সাধারণ উপায় কী? ধরে নিচ্ছি যে আমাকে একটি স্বেচ্ছাচারিত নির্ভুলতা গ্রন্থাগার ব্যবহার করা উচিত: যদি আমি গতির যত্ন না করি তবে এই জাতীয় গ্রন্থাগারটি সবচেয়ে ভাল কী?

উত্তর:


17

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

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

  1. আপনার কোডটিকে পুনরায় ফ্যাক্টর করুন যাতে আপনার প্রতিটি লাইনে একটি একক পাটিগণিত ক্রিয়াকলাপ থাকে।
  2. প্রতিটি ভেরিয়েবলের জন্য, উদাহরণস্বরূপ x, একটি ভেরিয়েবল তৈরি করুন x_errযা xধ্রুবক হিসাবে নির্ধারিত হলে শূন্য থেকে শুরু করা হয় ।
  3. প্রতিটি অপারেশনের জন্য, উদাহরণস্বরূপ z = x * y, z_errভাসমান-বিন্দুর পাটিগণিতের মানক মডেল এবং ফলস্বরূপ zএবং চলমান ত্রুটিগুলি x_errএবং ব্যবহার করে চলকটি আপডেট করুন y_err
  4. আপনার ফাংশনের রিটার্ন মানটির _errসাথে এটির সাথে একটি সম্পর্কিত মানও যুক্ত হওয়া উচিত। এটি আপনার সম্পূর্ণ রাউন্ডঅফ ত্রুটির উপর নির্ভরশীল একটি ডেটা-নির্ভর।

জটিল অংশটি হল পদক্ষেপ ৩. সর্বাধিক সাধারণ গাণিতিক ক্রিয়াকলাপগুলির জন্য, আপনি নিম্নলিখিত বিধিগুলি ব্যবহার করতে পারেন:

  • z = x + y -> z_err = u*abs(z) + x_err + y_err
  • z = x - y -> z_err = u*abs(z) + x_err + y_err
  • z = x * y -> z_err = u*abs(z) + x_err*abs(y) + y_err*abs(x)
  • z = x / y -> z_err = u*abs(z) + (x_err*abs(y) + y_err*abs(x))/y^2
  • z = sqrt(x) -> z_err = u*abs(z) + x_err/(2*abs(z))

u = eps/2ইউনিট রাউন্ডঅফ কোথায় হ্যাঁ, বিধি প্রণয়ন করিতে +এবং -একই। op(x)ফলাফল প্রয়োগের টেলর সিরিজের সম্প্রসারণটি ব্যবহার করে অন্য কোনও ক্রিয়াকলাপের নিয়মগুলি সহজেই বের করা যায় op(x + x_err)। অথবা আপনি গুগল করার চেষ্টা করতে পারেন। বা নিক হিগামের বইটি ব্যবহার করছে।

উদাহরণস্বরূপ, নিম্নলিখিত মতলব / অক্টাভ কোডটি বিবেচনা করুন যা হর্নার স্কিম ব্যবহার করে aএকটি নির্দিষ্ট সময়ে সহগের একটি বহুভুজকে মূল্যায়ন xকরে:

function s = horner ( a , x )
    s = a(end);
    for k=length(a)-1:-1:1
        s = a(k) + x*s;
    end

প্রথম পদক্ষেপের জন্য, আমরা দুটি অপারেশনগুলিকে এতে বিভক্ত করব s = a(k) + x*s:

function s = horner ( a , x )
    s = a(end);
    for k=length(a)-1:-1:1
        z = x*s;
        s = a(k) + z;
    end

তারপরে আমরা _errভেরিয়েবলগুলি প্রবর্তন করি । নোট ইনপুট aএবং xঅধিকৃত হয় সঠিক হবে, কিন্তু আমরা ঠিক যেমন ভাল ব্যবহারকারীর জন্য সংশ্লিষ্ট মান পাস করার প্রয়োজন হতে পারে a_errএবং x_err:

function [ s , s_err ] = horner ( a , x )
    s = a(end);
    s_err = 0;
    for k=length(a)-1:-1:1
        z = x*s;
        z_err = ...;
        s = a(k) + z;
        s_err = ...;
    end

শেষ অবধি, ত্রুটির শর্তাদি পাওয়ার জন্য আমরা উপরে বর্ণিত বিধিগুলি প্রয়োগ করি:

function [ s , s_err ] = horner ( a , x )
    u = eps/2;
    s = a(end);
    s_err = 0;
    for k=length(a)-1:-1:1
        z = x*s;
        z_err = u*abs(z) + s_err*abs(x);
        s = a(k) + z;
        s_err = u*abs(s) + z_err;
    end

নোট করুন যেহেতু আমাদের কোনও a_errবা নেই x_err, যেমন সেগুলি শূন্য বলে ধরে নেওয়া হয়, তত্ক্ষণাত ত্রুটি প্রকাশের ক্ষেত্রে সংশ্লিষ্ট পদগুলি এড়ানো হবে।

এট ভয়েইল! আমাদের কাছে এখন হর্নার স্কিম যা ফলাফলের পাশাপাশি একটি ডেটা-নির্ভর ত্রুটি অনুমান দেয় (দ্রষ্টব্য: এটি ত্রুটির উপরের একটি আবদ্ধ )।

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

±তোমার দর্শন লগ করাএক্স(1±তোমার দর্শন লগ করা)


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

1
@ জিফঅক্সবেরি: জটিলতার বিষয়টি নিয়ে আমি পুরোপুরি একমত। বৃহত্তর কোডগুলির জন্য আমি দৃ strongly়ভাবে একটি শ্রেণি / ডাটাটাইপ লেখার সুপারিশ করব যা ডাবলগুলিতে অপারেশনগুলি ওভারলোড করে যেমন প্রতিটি ক্রিয়াকলাপকে একবার একবার সঠিকভাবে প্রয়োগ করতে হবে। আমি বেশ অবাক হয়েছি যে মতলব / অষ্টাভের জন্য এর মতো কিছু নেই বলে মনে হচ্ছে।
পেড্রো

আমি এই বিশ্লেষণটি পছন্দ করি, তবে যেহেতু ত্রুটির শর্তগুলির গণনাও ভাসমান-বিন্দুতে সঞ্চালিত হয়, তাই ত্রুটি পদগুলি ভাসমান-পয়েন্ট ত্রুটির কারণে ত্রুটিযুক্ত হবে না?
প্লাজম্যাসেল

8

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

নিম্ন স্তরে জিএনইউ মাল্টিপল প্রিসিকেশন (জিএমপি) বিগনাম লাইব্রেরি , এটি একটি ওপেন সোর্স প্যাকেজ।

GMT এর সাথে এনটিএল ব্যবহার করা যেতে পারে দ্রুত পারফরম্যান্স প্রয়োজন, তবে এনটিএল তার নিজস্ব বেস রুটিনগুলি সরবরাহ করে যা অবশ্যই আপনি "গতির প্রতি যত্নশীল না হন" যদি ব্যবহারযোগ্য হয়। জিএমপি "দ্রুততম বিনাইনাম লাইব্রেরি" বলে দাবি করেছে। জিএমপি মূলত সি তে লেখা হয় তবে এতে সি ++ ইন্টারফেস থাকে।

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

রাউন্ডিং ত্রুটি বা বিচক্ষণতার ত্রুটি ইত্যাদির জন্য ত্রুটির আকার অনুসন্ধানের সাধারণ উপায় হ'ল অতিরিক্ত যথার্থ মান গণনা করা এবং এটি "স্ট্যান্ডার্ড" নির্ভুল মানের সাথে তুলনা করা। ত্রুটি আকারটি যুক্তিসঙ্গত নির্ভুলতার জন্য নির্ধারণ করার জন্য কেবলমাত্র সামান্য অতিরিক্ত নির্ভুলতা প্রয়োজন, যেহেতু গোলাকার ত্রুটিগুলি কেবলমাত্র অতিরিক্ত নির্ভুলতা গণনার তুলনায় "স্ট্যান্ডার্ড" নির্ভুলতায় যথেষ্ট বড়।

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

সি কোড স্নিপেট

    float fa,fb;
    double da,db,err;
    fa = 4.0;
    fb = 3.0;
    fa = fa/fb;
    fa -= 1.0;

    da = 4.0;
    db = 3.0;
    da = da/db;
    da -= 1.0;

    err = fa - da;
    printf("Single precision error wrt double precision value\n");
    printf("Error in getting 1/3rd is %e\n",err);
    return 0;

উপরের থেকে আউটপুট (সাইগউইন / মিনিজিডাব্লু 32 জিসিসি সরঞ্জাম চেইন):

Single precision error wrt double precision value
Error in getting 1/3rd is 3.973643e-08

সুতরাং ত্রুটিটি 1/3 য় একক নির্ভুলতার জন্য বৃত্তাকারে কী প্রত্যাশা করে about ত্রুটি সঠিকভাবে দশমিক কয়েকটি স্থানে বেশি পাওয়ার বিষয়ে কেউই (আমার সন্দেহ হবে) যত্ন নেবে না , কারণ ত্রুটির পরিমাপ মাত্রার জন্য নয় সঠিকতার জন্য।


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

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

7

জিএমপি (অর্থাত্, জিএনইউ মাল্টিপল প্রিসিশন লাইব্রেরি) হ'ল আমি জানি যে সবচেয়ে ভাল স্বেচ্ছাসেবী নির্ভুল গ্রন্থাগার।

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


আহ, আমি কেবলমাত্র আপনার উত্তরে বর্ণিত ব্যবধান গণিত লক্ষ্য করেছি ... উত্সাহিত!
আলী

2
রিচার্ড হ্যারিস ভাসমান পয়েন্ট ব্লুজ সম্পর্কে দুদক জার্নাল ওভারলোডে একটি দুর্দান্ত সিরিজ নিবন্ধ লিখেছিলেন । সম্পর্কে তাঁর প্রবন্ধে ব্যবধান গাণিতিক হয় ওভারলোড 103 ( পিডিএফ , p19-24)।
মার্ক বুথ

6

অন্তর বিশ্লেষণ দ্বারা কঠোর এবং স্বয়ংক্রিয় ত্রুটির অনুমান অর্জন করা যেতে পারে । আপনি সংখ্যার পরিবর্তে অন্তর দিয়ে কাজ করেন। উদাহরণস্বরূপ সংযোজন:

[a,b] + [c,d] = [min(a+c, a+d, b+c, b+d), max (a+c, a+d, b+c, b+d)] = [a+c, b+d]

রাউন্ড-অফটিও কঠোরভাবে পরিচালনা করা যায়, গোল বৃত্তাকার ব্যবধানটি গাণিতিক দেখুন

যতক্ষণ না আপনার ইনপুটটিতে সংকীর্ণ বিরতি থাকে, অনুমানগুলি ঠিক থাকে এবং গণনা করার জন্য এটি ব্যয়বহুল cheap দুর্ভাগ্যক্রমে, ত্রুটিটি প্রায়শই অত্যুক্তি করা হয়, নির্ভরতার সমস্যাটি দেখুন

আমি কোনও স্বেচ্ছাচারিত নির্ভুলতা বিরতি গণিত লাইব্রেরি জানি না।

অন্তর পাটিগণিত আপনার প্রয়োজনগুলি পরিবেশন করতে পারে কিনা তা এটি আপনার হাতের উপর নির্ভর করে depends


4

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

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


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

@ জিফঅক্সবেরি: হ্যাঁ - আমি মনে করি যে এই ডিফারেনশিয়াল বীজগণিতটি সংহতকরণের পদক্ষেপে ত্রুটির উপর আবদ্ধ হওয়ার জন্য স্টাফ।
এরিক পি।

0

আমাকে বলা হয়েছে যে এমপিআইআর হ'ল আপনি ভিজ্যুয়াল স্টুডিওতে কাজ করছেন তবে এটি ব্যবহারের জন্য একটি ভাল গ্রন্থাগার:

http://mpir.org/


SciComp.SE এ স্বাগতম! এই গ্রন্থাগারটি কীভাবে ভাসমান পয়েন্টের গণনার ত্রুটি পরিমাপ করতে ব্যবহার করা যেতে পারে তার কিছু বিশদ যুক্ত করতে পারেন?
ক্রিশ্চান ক্ল্যাসন

আমি চেষ্টা করব; আমি আসলে এখনও এখনও ঠিক আমার কম্পিউটারে এমপিআইআর সেট আপ করি নি! আমি জিএমপি এবং এমপিএফআর স্থাপন করেছি।
ফিশারহাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.