আমি @ জেনস গুস্টেড হেক্সাডেসিমাল সলিউশনটি সুপারিশ করছি:% এ ব্যবহার করুন।
ওপি "সর্বাধিক নির্ভুলতার সাথে মুদ্রণ চায় (বা কমপক্ষে সর্বাধিক গুরুত্বপূর্ণ দশমিক)"।
একটি সাধারণ উদাহরণটি হ'ল এক সপ্তম হিসাবে নিম্নরূপ:
#include <float.h>
int Digs = DECIMAL_DIG;
double OneSeventh = 1.0/7.0;
printf("%.*e\n", Digs, OneSeventh);
// 1.428571428571428492127e-01
তবে আরও গভীর খনন করা যাক ...
গাণিতিকভাবে, উত্তরটি "0.142857 142857 142857 ...", তবে আমরা সসীম নির্ভুলতা ভাসমান পয়েন্ট সংখ্যা ব্যবহার করছি। আসুন আইইইই 754 ডাবল-স্পষ্টতা বাইনারি ধরে নিই । সুতরাং OneSeventh = 1.0/7.0
নীচের মান ফলাফল। পূর্ববর্তী এবং নিম্নলিখিত প্রতিনিধিত্বমূলক double
ভাসমান পয়েন্ট সংখ্যাগুলিও দেখানো হয়েছে ।
OneSeventh before = 0.1428571428571428 214571170656199683435261249542236328125
OneSeventh = 0.1428571428571428 49212692681248881854116916656494140625
OneSeventh after = 0.1428571428571428 769682682968777953647077083587646484375
মুদ্রণ সঠিক একটি এর দশমিক উপস্থাপনা double
সীমাবদ্ধ রয়েছে ব্যবহারসমূহ।
<float.h>
আমাদের সহায়তায় সিতে 2 টি ম্যাক্রো পরিবার রয়েছে ।
প্রথম সেটটি দশমিক একটি স্ট্রিংয়ে মুদ্রণের জন্য উল্লেখযোগ্য অঙ্কের সংখ্যা তাই স্ট্রিংটি পিছনে স্ক্যান করার সময় আমরা আসল ভাসমান পয়েন্টটি পাই। সি স্পেকের সর্বনিম্ন মান এবং একটি নমুনা সি 11 সংকলক সহ দেখানো হয়েছে ।
FLT_DECIMAL_DIG 6, 9 (float) (C11)
DBL_DECIMAL_DIG 10, 17 (double) (C11)
LDBL_DECIMAL_DIG 10, 21 (long double) (C11)
DECIMAL_DIG 10, 21 (widest supported floating type) (C99)
দ্বিতীয় সেটটি এমন একটি উল্লেখযোগ্য অঙ্কের সংখ্যা যা কোনও স্ট্রিং কোনও ভাসমান বিন্দুতে স্ক্যান হতে পারে এবং তারপরেও এফপি মুদ্রিত হয়, এখনও একই স্ট্রিং উপস্থাপনাটি ধরে রাখে। সি স্পেকের সর্বনিম্ন মান এবং একটি নমুনা সি 11 সংকলক সহ দেখানো হয়েছে । আমি বিশ্বাস করি প্রাক-সি 99 উপলব্ধ।
FLT_DIG 6, 6 (float)
DBL_DIG 10, 15 (double)
LDBL_DIG 10, 18 (long double)
ম্যাক্রোগুলির প্রথম সেটটি উল্লেখযোগ্য সংখ্যার ওপির লক্ষ্য পূরণ করে । তবে সেই ম্যাক্রো সবসময় পাওয়া যায় না।
#ifdef DBL_DECIMAL_DIG
#define OP_DBL_Digs (DBL_DECIMAL_DIG)
#else
#ifdef DECIMAL_DIG
#define OP_DBL_Digs (DECIMAL_DIG)
#else
#define OP_DBL_Digs (DBL_DIG + 3)
#endif
#endif
"+ 3" হ'ল আমার আগের উত্তরের ক্রুস। এটি কেন্দ্র করে যদি রাউন্ড-ট্রিপ রূপান্তর স্ট্রিং-এফপি-স্ট্রিং (সেট # 2 ম্যাক্রো উপলব্ধ সি 89) জেনে থাকে তবে কীভাবে কেউ এফপি-স্ট্রিং-এফপি (সেট # 1 ম্যাক্রো পোস্ট সি 89 পোস্ট করে) এর জন্য ডিজিট নির্ধারণ করবেন? সাধারণভাবে, 3 যোগ ফলাফল ছিল।
এখন কত গুরুত্বপূর্ণ মুদ্রণের ডিজিটের পরিচিত এবং মাধ্যমে চালিত হয় <float.h>
।
এন উল্লেখযোগ্য দশমিক অঙ্ক মুদ্রণের জন্য কেউ বিভিন্ন ফর্ম্যাট ব্যবহার করতে পারে।
সহ "%e"
, যথার্থ ক্ষেত্রটি সীসা অঙ্ক এবং দশমিক বিন্দুর পরে অঙ্কের সংখ্যা । যাতে - 1
আদেশ হয়। দ্রষ্টব্য: এটি -1
প্রাথমিক নয়int Digs = DECIMAL_DIG;
printf("%.*e\n", OP_DBL_Digs - 1, OneSeventh);
// 1.4285714285714285e-01
সাথে "%f"
, যথার্থ ক্ষেত্র হ'ল দশমিক বিন্দুর পরে অঙ্কের সংখ্যা । মত একটি সংখ্যা জন্য OneSeventh/1000000.0
, এক হবে OP_DBL_Digs + 6
সব দেখতে উল্লেখযোগ্য সংখ্যার।
printf("%.*f\n", OP_DBL_Digs , OneSeventh);
// 0.14285714285714285
printf("%.*f\n", OP_DBL_Digs + 6, OneSeventh/1000000.0);
// 0.00000014285714285714285
দ্রষ্টব্য: অনেকেই অভ্যস্ত "%f"
। যে দশমিক বিন্দু পরে 6 ডিজিট প্রদর্শন করে; 6 হ'ল ডিসপ্লে ডিফল্ট, সংখ্যার যথার্থতা নয়।