সংখ্যা পরে "চ"


102

fসংখ্যাগুলি পরে কী বোঝায়? এটি সি বা উদ্দেশ্য-সি থেকে এসেছে? এটি একটি ধ্রুব সংখ্যায় যোগ না করার মধ্যে কোনও পার্থক্য আছে কি?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

আমি কেবল লিখব না কেন আপনি তা ব্যাখ্যা করতে পারেন:

CGRect frame = CGRectMake(0, 0, 320, 50);

উত্তর:


88
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

ফ্লোট কনস্ট্যান্ট ব্যবহার করে। (ধ্রুবক 0.0 সাধারণত অবজেক্টিভ সি তে একটি ডাবল ঘোষণা করে; শেষে একটি এফ রেখে - 0.0f - ধ্রুবকটিকে একটি (32-বিট) ভাসমান হিসাবে ঘোষণা করে))

CGRect frame = CGRectMake(0, 0, 320, 50);

ints ব্যবহার করে যা স্বয়ংক্রিয়ভাবে ফ্লোটে রূপান্তরিত হবে।

এই ক্ষেত্রে, উভয়ের মধ্যে কোনও (ব্যবহারিক) পার্থক্য নেই।


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

60

সন্দেহ হলে এসেম্বলারের আউটপুট পরীক্ষা করুন। উদাহরণস্বরূপ একটি ছোট, ন্যূনতম স্নিপেট লিখুন যেমন

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}

তারপরে -Sঅপশনটি দিয়ে এসেম্বলারের জন্য এটি সংকলন করুন ।

gcc -S test.m

test.sফাইলটিতে অ্যাসেমব্লার আউটপুট সংরক্ষণ করুন এবং .0fধ্রুবকগুলি থেকে সরান এবং কম্পাইল কমান্ডটি পুনরাবৃত্তি করুন। তারপরে diffনতুন test.sএবং পূর্ববর্তী একটি করুন। কিছু সত্য পার্থক্য আছে কিনা তা দেখানো উচিত মনে করুন। আমি মনে করি যে সংকলকটি কী মনে করে তাদের অনেকেরই দৃষ্টি রয়েছে তবে দিনের শেষে কোনও তত্ত্ব কীভাবে যাচাই করা যায় তা জানা উচিত।


11
আউটপুটটি আমার জন্য অভিন্ন হতে পারে, এমনকি কোনওটি ছাড়াই -O। আমি আই 686-আপেল-ডারভিন 10-জিসিসি
-4.2.1

2
আমি উপরের উদাহরণটি এলএলভিএম সংস্করণ .0.০.০ (ঝনঝন-700০০.০..6৫) x86_64-আপেল-ডারভিন15.0.0 দিয়ে চেষ্টা করেছি এবং। আউট ফাইলগুলিও অভিন্ন ছিল।
নিক

43

কখনও কখনও একটি পার্থক্য আছে।

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */

26

এটি কম্পিউটারকে বলে যে এটি একটি ভাসমান পয়েন্ট নম্বর (আমি ধরে নিচ্ছি আপনি এখানে সি / সি ++ সম্পর্কে কথা বলছেন)। যদি সংখ্যার পরে কোনও f থাকে না, তবে এটি একটি ডাবল বা পূর্ণসংখ্যার হিসাবে বিবেচনা করা হয় (দশমিক আছে কি না তার উপর নির্ভর করে)।

3.0f -> float
3.0 -> double
3 -> integer

এই কনভেনশনটি সি ++ স্ট্যান্ডার্ডের অংশ বা এটি সংকলকটিতে পাওয়া যায়?
jxramos

1
আমি যতদূর বলতে পারি এটি স্ট্যান্ডার্ডের একটি অংশ (কেউ যদি আমার ভুল হয় তবে আমাকে সংশোধন করে)। আমি যে দ্রুততম রেফারেন্সটি খুঁজে পেতে পারি তা ওপেন-std.org/jtc1/sc22/open/n2356/lex.html#lex.fcon , তবে আপনি যদি তাদের সন্ধানের যত্ন নেন তবে সম্ভবত আরও অনেক আধুনিক তথ্যসূত্র রয়েছে।
নিকলএইচ

5

আপনার উত্স কোডে একটি ভাসমান পয়েন্ট আক্ষরিক একটি ডাবল হিসাবে পার্স করা হয়েছে। এটিকে এমন ভেরিয়েবলের জন্য নির্ধারণ করা যা প্রকারের ফ্লোট টাইপ হয় নির্ভুলতা হারাবে। অনেক নির্ভুলতা, আপনি 7 টি উল্লেখযোগ্য অঙ্ক ছুঁড়ে ফেলছেন। "চ" পোস্টফিক্সটি আপনাকে সংকলককে বলতে দিন: "আমি জানি আমি কী করছি, এটি ইচ্ছাকৃত it

ত্রুটি তৈরির প্রতিক্রিয়াগুলি সেই ছোট বিটিডব্লিউ নয়। অনেকগুলি প্রোগ্রাম অশুভ-কল্পনাযুক্ত ভাসমান বিন্দু তুলনা করে বা ধরে নিয়েছে যে 0.1 সঠিকভাবে উপস্থাপনযোগ্য।


4

fযে আপনার সম্পর্কে সম্ভবত কম্পাইলার বলতে যে এটি একটি ভাসা সঙ্গে কাজ করছে বোঝানো হয় কথা বলা হয়। আপনি বাদ fদিলে এটি সাধারণত ডাবলে অনুবাদ করা হয়।

উভয় পয়েন্ট সংখ্যা ভাসমান হয়, কিন্তু একটি floatব্যবহারসমূহ কম বিট (সুতরাং ছোট এবং কম সুনির্দিষ্ট) একটি চেয়ে double


3

এটি একটি সি জিনিস - ভাসমান পয়েন্ট আক্ষরিক ডিফল্টরূপে ডাবল নির্ভুলতা (ডাবল)। একটি চ প্রত্যয় যুক্ত করা তাদের একক নির্ভুলতা (ভাসা) করে তোলে।

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


2

সি থেকে এর অর্থ ভাসা আক্ষরিক ধ্রুবক। আপনি "চ" এবং ".0" উভয়ই বাদ দিতে পারেন এবং আপনার উদাহরণগুলিতে ইনটগুলি ফ্লোটে অন্তর্নিহিত রূপান্তরিত করার কারণে ব্যবহার করতে পারেন।


1

এটি অবশ্যই সি থেকে এসেছে এবং এটি 'ডাবল' প্রকারের চেয়ে 'ফ্লোট' ব্যবহারের আকাঙ্ক্ষাকে প্রতিফলিত করে। এটি দীর্ঘ সংখ্যার ইঙ্গিত করার জন্য সংখ্যায় এল এর মতো প্রত্যয়গুলির অনুরূপ। আপনি কেবল পূর্ণসংখ্যা ব্যবহার করতে পারেন এবং সংকলক স্বয়ংকে যথাযথ হিসাবে রূপান্তর করবে (এই নির্দিষ্ট দৃশ্যের জন্য)।


0

এটি সাধারণত সংকলককে বলে যে মানটি হ'ল একটি float, যেমন একটি ভাসমান বিন্দু পূর্ণসংখ্যা। এর অর্থ এটি ইন্টিজার, দশমিক মান এবং এক্সপেনশনিয়ালগুলি সঞ্চয় করতে পারে, যেমন 1, 0.4বা 1.2e+22

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.