ডাবল প্রিন্টে জন্য সঠিক বিন্যাস নির্দিষ্টকরণকারক


480

প্রিন্টফের জন্য সঠিক বিন্যাস নির্দিষ্টকরণকারী কী double? এটা %fনাকি %lf? আমি বিশ্বাস করি এটি %fতবে আমি নিশ্চিত নই।

কোড নমুনা

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

19
যদি আপনি কোনও সি 89 লাইব্রেরিতে আটকে থাকেন তবে অপরিবর্তিত "%lf"; C99 এবং সি 11 লাইব্রেরিতে এটি একই হিসাবে সংজ্ঞায়িত করা হয় "%f"
pmg

1
আপনার রূপটি যতটা ঠিক ঠিক ততই সঠিক। %lfএর জন্য সঠিক বিন্যাস নির্দিষ্টকরণকারক double। তবে এটি C99 তে তাই হয়ে গেল। তার আগে একজনকে ব্যবহার করতে হয়েছিল %f
এন্টি

উত্তর:


624

"%f"দ্বিগুণের জন্য (বা কমপক্ষে একটি) সঠিক বিন্যাসটি। সেখানে হয় একটি কোন বিন্যাস floatআপনি একটি পাস করার প্রচেষ্টা কারণ, floatকরতে printf, এটি উন্নীত করা হবে doubleসামনে printfতা গ্রহণ করে 1"%lf"বর্তমান মান lহিসাবে এটি গ্রহণযোগ্য - fরূপান্তর নির্দিষ্টকরণকারী (অন্যদের মধ্যে) অনুসরণ করে যদি কোনও প্রভাব না থাকে হিসাবে নির্দিষ্ট করা হয় ।

দ্রষ্টব্য যে এটি এমন এক জায়গা যা printfবিন্যাসের স্ট্রিংগুলি scanf(এবং fscanf, ইত্যাদি) বিন্যাসের স্ট্রিংগুলির থেকে যথেষ্ট আলাদা । আউটপুট জন্য, আপনি একটি মান পাস করছেন , যা ভেরিয়াদিক প্যারামিটার হিসাবে পাস floatকরার doubleসময় থেকে প্রচার করা হবে । সহযোগিতার জন্য একটি পার করছি পয়েন্টার , যা উন্নীত করা হয় না, তাই আপনি বলতে হবে scanfআপনি একটি পড়তে চান floatবা doubleতাই জন্য, scanf, %fমানে আপনি একটি পড়তে চান floatএবং %lfউপায়ে আপনি একটি পড়তে চান double(এবং, এটা কি জন্য মূল্য, এক জন্য long double, আপনি %Lfউভয় printfবা জন্য ব্যবহার করুন scanf)।


1. C99, §6.5.2.2 / 6: "যদি ডাকা ফাংশনটি বোঝায় এমন অভিব্যক্তিটির প্রোটোটাইপ অন্তর্ভুক্ত না থাকে তবে প্রতিটি যুক্তিতে পূর্ণসংখ্যা প্রচার হয় এবং টাইপ ফ্লোট রয়েছে এমন যুক্তিগুলি দ্বিগুণ হিসাবে প্রচার করা হয়। এগুলিকে ডিফল্ট আর্গুমেন্ট প্রচার বলা হয়। সি ++ এর মধ্যে শব্দটি কিছুটা আলাদা (যেমন, এটি "প্রোটোটাইপ" শব্দটি ব্যবহার করে না) তবে প্রভাবটি একই রকম: সমস্ত ভ্যারিয়েডিক প্যারামিটারগুলি ফাংশনটি গ্রহণের আগেই ডিফল্ট প্রচারে যায়।


8
নোট করুন যে সংকলন করার সাথে সাথে g++প্রত্যাখ্যান :%lf-Wall -Werror -pedanticerror: ISO C++ does not support the ‘%lf’ gnu_printf format
কিনন

2
@ কেনান: যদি তাই হয় (জি ++ এর বর্তমান সংস্করণ ধরে নেওয়া লিজে), এটি জি ++ এ একটি বাগ। সি 98/90 এবং সি ++ 98/03 এর ক্ষেত্রে অনুমতি দেওয়া lছিল একটি এক্সটেনশন। C99 / 11 এবং C ++ 11 মানগুলির এটির অনুমোদনের জন্য বাস্তবায়ন প্রয়োজন।
জেরি কফিন

1
মজার ব্যাপার হলো, scanf না চান doubleগুলি দ্বারা প্রতিনিধিত্ব %lf: এটা অভিযোগ আশা যে float *দেখলেন double *শুধু সঙ্গে %f
এরিক ডাণ্ড

1
@ জেরি কফিন জি ++ এখনও জি ++ 98 মোডে ডিফল্ট রয়েছে
এমএম

5
@EricDand এর কারণ scanfযেখানে সঞ্চয় করতে এটা কি লেখা আছে, তাই পয়েন্টার লাগে চাহিদা জানতে কত বড় স্থান হচ্ছে সরু-এ, যেহেতু printfমান নিজেদের, এবং "ডিফল্ট যুক্তি প্রচারগুলি" লাগে উভয় শেষ পর্যন্ত হিসাবে মানে doubleগুলি, তাই lহয় মূলত alচ্ছিক।
ট্রিপহাউন্ড

63

প্রদত্ত C99 মান (বলতে গেলে, N1256 fprintf (printf,,, sprintf, ...) বা, scanf: খসড়া), বিধি ধরনের ফাংশন উপর নির্ভর করে।

এখানে প্রাসঙ্গিক অংশ উত্তোলন করা হয়:

ভূমিকা

এই দ্বিতীয় সংস্করণটি আইএসও / আইসিসি 9899 / সিওআর 1: 1994, আইএসও / আইসিসি 9899 / এএমডি 1: 1995 এবং আইএসও / আইসিসি 9899 / সিওর 2: 1996 দ্বারা সংশোধিত ও সংশোধিত হিসাবে প্রথম সংস্করণটি আইএসও / আইইসি 9899: 1990 কে বাতিল করেছে এবং প্রতিস্থাপন করবে। পূর্ববর্তী সংস্করণ থেকে বড় পরিবর্তনগুলির মধ্যে রয়েছে:

  • %lf রূপান্তর নির্দিষ্টকরণের মধ্যে অনুমতি দেওয়া printf

7.19.6.1 fprintfফাংশন

7 দৈর্ঘ্য সংশোধক এবং এর অর্থ হ'ল:

l (ell) নির্দিষ্ট করে যে (...) কোনও নিম্নলিখিত, এ, ই, ই, এফ, এফ, জি, বা জি রূপান্তর নির্দিষ্টকরণকারীর উপর প্রভাব ফেলে না no

এল উল্লেখ করে যে নিম্নলিখিত একটি, এ, ই, ই, এফ, এফ, জি, বা জি রূপান্তর নির্দিষ্টকরণটি একটি দীর্ঘ দ্বৈত যুক্তির জন্য প্রযোজ্য।

একই নিয়ম নির্দিষ্ট fprintfজন্য আবেদন printf, sprintfঅনুরূপ ফাংশন এবং।

7.19.6.2 fscanfফাংশন

11 দৈর্ঘ্য সংশোধক এবং এর অর্থ হ'ল:

l (ell) সুনির্দিষ্ট করে যে (...) যে নিম্নলিখিত a, A, e, E, f, F, g, বা G রূপান্তর নির্দিষ্টকারকটি দ্বিগুণ টাইপ পয়েন্টার সহ একটি যুক্তির ক্ষেত্রে প্রযোজ্য;

এল উল্লেখ করে যে নিম্নলিখিত একটি, এ, ই, ই, এফ, এফ, জি, বা জি রূপান্তর নির্দিষ্টকরণটি টাইপ পয়েন্টারটি দীর্ঘ দ্বিগুণে যুক্তির ক্ষেত্রে প্রযোজ্য।

12 রূপান্তর নির্দিষ্টকরণকারী এবং এর অর্থ হ'ল: ক, ই, চ, জি একটি বিকল্প স্বাক্ষরিত ভাসমান-পয়েন্ট নম্বরটির সাথে মেলে, (...)

14 রূপান্তরকরণের সুনির্দিষ্ট এ, ই, এফ, জি এবং এক্স যথাযথ এবং যথাযথ, ক, ই, চ, জি এবং এক্স হিসাবে একই আচরণ করে।

দীর্ঘ বিবরণী সংক্ষিপ্ত, fprintfনিম্নলিখিত সুনির্দিষ্ট এবং সম্পর্কিত ধরণের জন্য নির্দিষ্ট করা হয়েছে:

  • %f -> দ্বিগুণ
  • %Lf -> দীর্ঘ ডাবল।

এবং fscanfএটির জন্য:

  • %f -> ভাসা
  • %lf -> দ্বিগুণ
  • %Lf -> দীর্ঘ ডাবল।

25

এটা হতে পারে %f, %gবা %eকিভাবে আপনি সংখ্যা ফরম্যাট করতে চান উপর নির্ভর করে। দেখুন এখানে আরো বিস্তারিত জানার জন্য। lপরিবর্তক প্রয়োজন হয় scanfসঙ্গে double, কিন্তু না এ printf


1
-1: l(ছোট হাতের সংশোধক) সংশোধকটি পূর্ণসংখ্যার ধরণের ( cplusplus.com/references/clibrary/cstdio/printf ) Lজন্য এবং ভাসমান পয়েন্ট ধরণের জন্য। অতিরিক্ত হিসাবে, Lসংশোধকটি long doubleএকটি সমতল নয়, একটি প্রত্যাশা করে double
user470379

10
user470379: তাহলে আমার উত্তরের সাথে বৈপরীত্য কোথায়? আমি কি বলিনি যে lএটির printfজন্য প্রয়োজনীয় নয় double
ভিটাউট

15

ফর্ম্যাট %lfহ'ল এটির printfজন্য একেবারে সঠিক বিন্যাস double। আপনার কোডে কোনও ভুল নেই।

বিন্যাস %lfমধ্যে printfসি ল্যাঙ্গুয়েজ, যার জন্য নির্মিত বিন্যাস নির্দিষ্টকরী মধ্যে পৃষ্ঠস্থ "অসঙ্গতি" পুরোনো (প্রাক C99) সংস্করণগুলিতে সমর্থিত হয়নি doubleমধ্যে printfএবং scanf। সেই অতি স্তরের অসঙ্গতি C99 এ স্থির করা হয়েছে।

আপনি ব্যবহার করতে প্রয়োজন হয় না %lfসঙ্গে doubleমধ্যে printf। আপনি %fযদি পছন্দ করেন তবে আপনিও এটি ব্যবহার করতে পারেন ( %lfএবং %fএর সাথে সমান printf)। কিন্তু আধুনিক সি এটা ব্যবহার করতে পছন্দ নিখুঁত জ্ঞান করে তোলে %fসঙ্গে float, %lfসঙ্গে doubleএবং %Lfসঙ্গে long doubleধারাবাহিকভাবে উভয় printfএবং scanf


সঙ্গে scanf(), "%f", "%lf"একটি ম্যাচ float *, double *না float, doubleগত লাইন দ্বারা উহ্য।
chux - মনিকা 13

9

%Lf(মূলধনটি দ্রষ্টব্য L) হ'ল দীর্ঘ দ্বিগুণের জন্য ফর্ম্যাট স্পেসিফায়ার

প্লেইন জন্য doubles, হয় %e, %E, %f, %gবা %Gকরতে হবে।


মধ্যে পার্থক্য কি %gএবং %G?
ইয়ানপাস

যথাক্রমে এক্সপ্যান্ট প্রতীকটির জন্য @ আয়ানপাস, ছোট হাতের / বড় হাতের অক্ষর।
ফ্রিডরিক হামিদি

দুঃখিত,% g এবং% G আউটপুট E প্রতীক করে। এছাড়াও তারা বিভিন্ন ক্ষেত্রে INF এবং inf আউটপুট দেয়
yanpas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.