ডাবলসে মডুলাস ব্যবহার করতে পারবেন না?


185

আমার সি ++ তে একটি প্রোগ্রাম রয়েছে (জি ++ ব্যবহার করে সংকলিত)। আমি মডুলাস ফাংশনে অপারেটর হিসাবে দুটি ডাবল প্রয়োগ করার চেষ্টা করছি, তবে আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

ত্রুটি: বাইনারি 'অপারেটর%' তে 'ডাবল' এবং 'ডাবল' প্রকারের অবৈধ অপারেশনগুলি

কোডটি এখানে:

int main() {
    double x = 6.3;
    double y = 2;
    double z = x % y;
}

12
যেমন উল্লেখ করা হয়েছে, fmod () প্রয়োজনীয় ফাংশন সরবরাহ করে। যেমনটি এখনও উল্লেখ করা হয়নি, এটি বুঝতে গুরুত্বপূর্ণ যে দ্বিতীয় অপারেন্ডে গোলাকার ত্রুটিগুলি fmodঅপ্রত্যাশিত আচরণের কারণ হতে পারে। উদাহরণস্বরূপ, fmod(1, 0.1);গাণিতিকভাবে শূন্য হওয়া উচিত তবে বাস্তবে এটি প্রায় 0.1 হয়। ত্রুটির পরিমাণটি ভাগফলের মাত্রার সাথে বেড়ে যায়। উদাহরণস্বরূপ, fmod(9E14, 0.1);প্রায় 0.05 এ মূল্যায়ন করে, যা গাণিতিক দিক থেকে খুব সাধারণ ভুল।
সুপারক্যাট

1
@ সুপারকার্যাট আরও বিশদ বিবরণ হবে। আমি মনে করি আপনি কী সত্য বলছেন তা ঘটানোর জন্য পর্দার আড়ালে কী রয়েছে তার একটি ধারণা আছে তবে আপনি যা বলেন তা সত্য বলে যুক্তিগুলি দেখে ভাল লাগবে; পর্দার আড়ালে এটি কীভাবে কাজ করে তা দেখতে আকর্ষণীয় হবে (আমি মনে করি আমি বুঝতে পেরেছি তবে খুব সহজেই ভুল হতে পারে)।
রাস্তাজেদি

3
ভাসমান-পয়েন্টের মানগুলি হুবহু সংখ্যার গুণক বা দুটিয়ের ক্ষয়ের ভগ্নাংশ উপস্থাপন করে। উদাহরণস্বরূপ, পূর্ণসংখ্যার আক্ষরিক 0.1 হুবহু 3602879701896397/36028797018963968 (পরের মানটি একটি শক্তির)। fmod(x,0.1)সংখ্যার মান "এক দশমাংশ" দ্বারা ভাগ করার পরিবর্তে সেই নির্দিষ্ট ভগ্নাংশ দ্বারা x কে ভাগ করবে এবং বাকী অংশটি নেবে।
ক্যাট

উত্তর:


272

%অপারেটর পূর্ণসংখ্যার জন্য। আপনি fmod()ফাংশনটি সন্ধান করছেন

#include <cmath>

int main()
{
    double x = 6.3;
    double y = 2.0;
    double z = std::fmod(x,y);

}

আমি কিউটি জন্য সি ++ এ প্রোগ্রামিং করছি এবং fmod এর একটি বাগ রয়েছে। Fmod (কোণ, 360) এর ফলাফল 360 (ওয়াট ?!) হতে পারে
পল

7
@ পল: এটি সম্ভবত কোনও বাগ নয়। যদি angleহয়, বলুন, 359.9999999তবে উভয়ই angleএবং fmod(angle, 360)সম্ভবত প্রদর্শিত হবে 360। (প্রয়োজন অনুসারে আরও 9 টি যোগ করুন)) 50 টি সংখ্যক নির্ভুলতার সাথে মানগুলি মুদ্রণের চেষ্টা করুন।
কিথ থমসন

@ পল কিউটির কিস্টস্ট্রিং :: ফর্ম্যাটটি গোল হয়ে যাবে। যদি এটি গুরুতর হয় তবে আপনাকে নিজেই গোল করতে হবে বা "360" এর আউটপুট পরীক্ষা করতে হবে এবং এটি নিজের মান দিয়ে প্রতিস্থাপন করতে হবে।
jfh


5

fmod()থেকে ব্যবহার করুন <cmath>। আপনি যদি সি হেডার ফাইলটি অন্তর্ভুক্ত করতে না চান:

template<typename T, typename U>
constexpr double dmod (T x, U mod)
{
    return !mod ? x : x - mod * static_cast<long long>(x / mod);
}

//Usage:
double z = dmod<double, unsigned int>(14.3, 4);
double z = dmod<long, float>(14, 4.6);
//This also works:
double z = dmod(14.7, 0.3);
double z = dmod(14.7, 0);
double z = dmod(0, 0.3f);
double z = dmod(myFirstVariable, someOtherVariable);

3
আপনি কেন সি হেডার ফাইলটি অন্তর্ভুক্ত করতে চান না? এটা এখানে কি জন্য।
কিথ থমসন

2

এটি করতে আপনার নিজের মডুলাস ফাংশনটি প্রয়োগ করতে পারেন :

double dmod(double x, double y) {
    return x - (int)(x/y) * y;
}

তারপরে আপনি বাকীটি dmod(6.3, 2)পেতে সহজভাবে ব্যবহার করতে পারেন 0.3,।


তবুও নিখুঁত সমাধান নয়। x = 10.499999999999998, y = 0.69999999999999996 0.0 এর পরিবর্তে 0.69999999999999929
ফেরান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.