double
Cout ব্যবহার করে আমি নির্ভুলতার সাথে কোনও মান কীভাবে মুদ্রণ করব ?
ব্যবহার hexfloat
বা
ব্যবহার scientific
এবং নির্ভুলতা সেট করুন
std::cout.precision(std::numeric_limits<double>::max_digits10 - 1);
std::cout << std::scientific << 1.0/7.0 << '\n';
// C++11 Typical output
1.4285714285714285e-01
অনেকগুলি উত্তরের মধ্যে 1 টির মধ্যে কেবল একটির ঠিকানা) 2) স্থির / বৈজ্ঞানিক বিন্যাস বা 3) নির্ভুলতা। নির্ভুলতার সাথে অনেকগুলি উত্তর প্রয়োজনীয় সঠিক মান সরবরাহ করে না। সুতরাং একটি পুরানো প্রশ্নের এই উত্তর।
- কি বেস?
এ double
অবশ্যই বেস 2 ব্যবহার করে এনকোড করা হয়েছে সি ++ 11 এর সাথে সরাসরি ব্যবহার করার জন্য প্রিন্ট করা std::hexfloat
।
যদি দশমিক দশমিক আউটপুট গ্রহণযোগ্য হয় তবে আমাদের কাজ শেষ are
std::cout << "hexfloat: " << std::hexfloat << exp (-100) << '\n';
std::cout << "hexfloat: " << std::hexfloat << exp (+100) << '\n';
// output
hexfloat: 0x1.a8c1f14e2af5dp-145
hexfloat: 0x1.3494a9b171bf5p+144
- নাহলে:
fixed
নাকি scientific
?
এ double
একটি ভাসমান পয়েন্ট টাইপ, স্থির বিন্দু নয় ।
ছোট কিছু মুদ্রণ করতে ব্যর্থ হিসাবে ব্যবহার করবেন না । বড় হিসাবে , এটি অনেকগুলি সংখ্যা মুদ্রণ করে, সম্ভবত শত শত সন্দেহজনক তথ্যবহুলতা।std::fixed
double
0.000...000
double
std::cout << "std::fixed: " << std::fixed << exp (-100) << '\n';
std::cout << "std::fixed: " << std::fixed << exp (+100) << '\n';
// output
std::fixed: 0.000000
std::fixed: 26881171418161356094253400435962903554686976.000000
সম্পূর্ণ নির্ভুলতার সাথে মুদ্রণ করতে, প্রথমে ব্যবহার করুন std::scientific
যা "বৈজ্ঞানিক স্বরলিপিতে ভাসমান-পয়েন্ট মান লিখবে"। দশমিক পয়েন্টের পরে 6 ডিজিটের ডিফল্ট লক্ষ্য করুন, একটি অপর্যাপ্ত পরিমাণ, পরবর্তী বিন্দুতে পরিচালিত হবে।
std::cout << "std::scientific: " << std::scientific << exp (-100) << '\n';
std::cout << "std::scientific: " << std::scientific << exp (+100) << '\n';
// output
std::scientific: 3.720076e-44
std::scientific: 2.688117e+43
- কত নির্ভুলতা (মোট সংখ্যা কত)?
double
বাইনারি বেস 2 ব্যবহার করে একটি এনকোড করা বিভিন্ন শক্তির 2 এর মধ্যে একই নির্ভুলতার এনকোড করে This এটি প্রায়শই 53 বিট হয়।
[1.0 ... 2.0) 2 53 আলাদা double
,
[2.0 ... 4.0) 2 53 আলাদা double
,
[4.0 ... 8.0) 2 53 আলাদা double
,
[8.0 ... 10.0) আছে 2 / 8 * 2 53 টি আলাদা double
।
তবুও যদি কোডটি দশমিক দশকে N
উল্লেখযোগ্য অঙ্ক সহ মুদ্রণ করে তবে সংমিশ্রনের সংখ্যা [1.0 ... 10.0) 9/10 * 10 এন হয় ।
যাই হোক না কেন N
(নির্ভুলতা) বেছে নেওয়া হোক না কেন double
এবং দশমিক পাঠ্যের মধ্যে এক থেকে এক ম্যাপিং থাকবে না । যদি কোনও স্থির N
বাছাই করা হয়, কখনও কখনও এটি নির্দিষ্ট double
মানগুলির জন্য সত্য প্রয়োজনের তুলনায় কিছুটা কম বা কম be আমরা খুব কম ( a)
নীচে) বা অনেকগুলি ( b)
নীচে) এ ত্রুটি করতে পারি ।
3 প্রার্থী N
:
ক) পাঠ্য-পাঠ্য N
থেকে রূপান্তর করার সময় একটি ব্যবহার করুন double
আমরা সকলের জন্য একই পাঠ্যে উপস্থিত হই double
।
std::cout << dbl::digits10 << '\n';
// Typical output
15
খ) টেক্সট N
থেকে রূপান্তর করার সময় একটি ব্যবহার double
করুন- double
আমরা double
সবার জন্য একই সাথে পৌঁছেছি double
।
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
যখন max_digits10
উপলভ্য থাকে না তখন নোট করুন যে বেস 2 এবং বেস 10 বৈশিষ্ট্যের কারণে digits10 + 2 <= max_digits10 <= digits10 + 3
আমরা digits10 + 3
যথেষ্ট পরিমাণে দশমিক অঙ্ক মুদ্রিত হওয়ার জন্য বীমা করতে পারি ।
গ) N
মানের সাথে পরিবর্তিত এমন একটি ব্যবহার করুন ।
কোডটি যখন সর্বনিম্ন পাঠ্য ( N == 1
) বা একটি ( এর ক্ষেত্রে ) এর সঠিক মান প্রদর্শন করতে চায় তখন এটি কার্যকর হতে পারে । তবুও যেহেতু এটি "কাজ" এবং সম্ভবত ওপি'র লক্ষ্য নয়, এটি আলাদা করা হবে।double
N == 1000-ish
denorm_min
এটি সাধারণত খ) যা " double
সম্পূর্ণ নির্ভুলতার সাথে মান মুদ্রণ করতে" ব্যবহৃত হয় । কিছু অ্যাপ্লিকেশন ক) খুব বেশি তথ্য না দেওয়ার ক্ষেত্রে ত্রুটি পছন্দ করতে পারে।
সঙ্গে .scientific
, .precision()
সেট সংখ্যা সংখ্যা দশমিক বিন্দু পরে প্রিন্ট করতে, তাই 1 + .precision()
সংখ্যার ছাপা হয়। কোডের max_digits10
মোট সংখ্যা দরকার তাই .precision()
একটি দিয়ে ডাকা হয় max_digits10 - 1
।
typedef std::numeric_limits< double > dbl;
std::cout.precision(dbl::max_digits10 - 1);
std::cout << std::scientific << exp (-100) << '\n';
std::cout << std::scientific << exp (+100) << '\n';
// Typical output
3.7200759760208361e-44
2.6881171418161356e+43
//1234567890123456 17 total digits
অনুরূপ সি প্রশ্ন
fixed
? সাথেdouble h = 6.62606957e-34;
,fixed
আমাকে দেয়0.000000000000000
এবংscientific
আউটপুট দেয়6.626069570000000e-34
।