ইন্ট বনাম মেঝেতে কাস্ট করুন


120

এর মধ্যে কি কোনও পার্থক্য রয়েছে:

float foo1 = (int)(bar / 3.0);
float foo2 = floor(bar / 3.0);

আমি যেমন বুঝতে পারি উভয় ক্ষেত্রেই একই ফল রয়েছে result সংকলিত কোডে কি কোনও পার্থক্য রয়েছে?


1
এর সাথে কিছুটা ভাল floorতবে সাবধান থাকুন যে এটি এর জন্য doubleনয় float। C99 এছাড়াও আছে floorfজন্য float
জেনস গুষ্ট্ট

2
বারের ইতিবাচক হওয়া পর্যন্ত তাদের একই ফলাফল রয়েছে
জ্যাক

1
(দ্রষ্টব্য: সি ++ তে দয়া করে #include<cmath>ব্যবহার করুন std::floor)
ব্যবহারকারী 202729


@ চ্যাক্স কোনও ব্যাপার না, 3.0 দ্বারা ভাগ করা যেকোন উপায়ে দ্বিগুণ হয়ে যাবে
কাল

উত্তর:


193

কোন int এ কাস্ট করা শূন্যের দিকে ছাঁটা হবে। floor()নেতিবাচক অসীমের দিকে কেটে যাবে। barনেতিবাচক থাকলে এটি আপনাকে বিভিন্ন মান দেয় ।


15
আমার মনে হয় আপনি এখানে মাথায় পেরেক মারলেন hit আর একটি পার্থক্য, যদি floor()অভিপ্রায় হয়, যদি মানটি barখুব বেশি বড় হয় int
ফ্রেড লারসন

আপনি কি এই বিবৃতি জন্য কোন উত্স আছে?
হ্যালো গুডবাই

1
ফলাফল ইতিবাচক হলেও এটির নিশ্চয়তা নেই। দেখুন এই এবং এই
ব্যবহারকারী 202729

27

যেমন আগেই বলা হয়েছিল, ধনাত্মক সংখ্যার জন্য তারা একই, তবে তারা নেতিবাচক সংখ্যার জন্য পৃথক। নিয়মটি হ'ল 0 টির দিকে ইনট রাউন্ড, অন্যদিকে মেঝে রাউন্ডটি নেতিবাচক অসীমের দিকে।

floor(4.5) = (int)4.5 = 4
floor(-4.5) = -5 
(int)(-4.5) = -4

এটি বলা হচ্ছে, মৃত্যুদণ্ড কার্যকর করার সময়টিতেও পার্থক্য রয়েছে। আমার সিস্টেমে, আমি টাইম করেছি যে কাস্টিং তল থেকে কমপক্ষে 3 গুণ বেশি দ্রুত।

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

int int_floor(double x) 
{ 
    return (int)(x+100000) - 100000; 
}

অবশ্যই এটি এক্স এর খুব বড় মানগুলির জন্য ব্যর্থ হবে (আপনি কিছু ওভারফ্লো সংক্রান্ত সমস্যার সমাধান করবেন) এবং -100000 এর নীচে নেতিবাচক মানগুলির জন্য। তবে আমি এটিকে মেঝে থেকে কমপক্ষে 3 গুণ বেশি দ্রুতগতিতে আটকে রেখেছি, যা সত্যিই সমালোচনামূলক ছিল আমাদের অ্যাপ্লিকেশন জন্য। এটিকে নুনের দানার সাথে নিয়ে নিন, এটি আপনার সিস্টেমে পরীক্ষা করুন ইত্যাদি but


"আমি এটিকে ফ্লোর থেকে কমপক্ষে 3 গুণ দ্রুত হতে পেরেছি" -> ওপি ব্যবহার করছে float, doubleসম্ভবত নয় - সম্ভবত doubleআপনার প্রয়োগ ছিল। যদি সি floorf()থাকে তবে floatএস ব্যবহার করতে ভুলবেন না ।
chux - মনিকা

@ chux আমার মনে হয় যে কোনও পার্থক্যের একমাত্র কারণ হ'ল castালাই একটি সংকলন-সময় অপ্টিমাইজেশনের অনুমতি দেয়। যাতে রূপান্তরটি কার্যকরভাবে কার্যকর করার সময় সম্পূর্ণরূপে অপসারণ করা যেতে পারে।
ClydeTheGhost 15

9

সুতরাং 101, লোকেরা আপনার প্রশ্নের জবাব দেওয়ার পরে আপনার প্রশ্ন পরিবর্তন করবেন না, পরিবর্তে একটি নতুন প্রশ্ন লিখুন।

কেন আপনি মনে করেন যে তাদের একই ফল হবে?

float foo = (int)(bar / 3.0) //will create an integer then assign it to a float

float foo = fabs(bar / 3.0 ) //will do the absolute value of a float division

bar = 1.0

foo1 = 0;
foo2 = 0.33333...

1
আপনি কি বলতে চাইছেন fabs? প্রশ্ন ছিল floor। মেঝেতে 0.33333... হয় 0
অ্যারন ফ্র্যাঙ্ক

2
@ অ্যারানফ্রানেকে মূল প্রশ্নটি পরিবর্তন করা হয়েছে। 8 বছরের মধ্যে অনেক কিছুই ঘটতে পারে বলে মনে হয় ;-) অন্যান্য উত্তরগুলির একই ভিত্তি রয়েছে লক্ষ্য করুন
AndersK

4

সম্পাদনা: কারণ fabs()এবং এর মধ্যে বিভ্রান্তির কারণে প্রশ্নটি সংশোধন করা হতে পারে floor()

মূল প্রশ্ন উদাহরণ লাইন দেওয়া:

1.  float foo = (int)(bar / 3.0);

2.  float foo = fabs(bar / 3.0);

পার্থক্য হ'ল বারটি নেতিবাচক হলে ফলাফলটি প্রথমটির সাথে নেতিবাচক হবে তবে দ্বিতীয়টির সাথে ইতিবাচক হবে। প্রথমটি একটি পূর্ণসংখ্যার সাথে কাটা হবে এবং দ্বিতীয়টি ভগ্নাংশের অংশ সহ পূর্ণ দশমিক মান প্রদান করবে।


3

হ্যাঁ. fabsতার যুক্তির নিখুঁত মান প্রদান করে এবং INT এ castালাই বিভাজন কেটে দেয় (নিকটে নিকটবর্তী অবধি), সুতরাং ফলাফল প্রায় সর্বদা পৃথক হবে।


2

দুটি প্রধান পার্থক্য রয়েছে:

  1. অন্যরা যেমন উল্লেখ করেছে, কোনও পূর্ণসংখ্যার কাছে ingালাই শূন্যের দিকে ছাঁটা floor()হবে , যেখানে সর্বদা নেতিবাচক অনন্তের দিকে ছাঁটাই হবে; এটি একটি নেতিবাচক অপারেন্ডের জন্য আলাদা আচরণ।

  2. কেউ (এখনও) অন্য একটি তফাত দেখায়নি বলে মনে হয় - আপনার যুক্তি যদি বৃহত্তর বা সমান MAX_INT+1(বা এর চেয়ে কম -MAX_INT-1) হয় তবে একটিতে কাস্টিংয়ের intফলে শীর্ষ-বিটগুলি (সি, সম্ভবত) বা অপরিবর্তিত আচরণ ( সি ++ এবং সম্ভবত সি)। EG যদি আপনার int32 বিট হয়, আপনার কাছে কেবলমাত্র একটি সাইন বিট প্লাস 31 বিট ডেটা থাকবে। সুতরাং doubleআকারে বৃহত আকারের সাথে এটি ব্যবহার করা অনিচ্ছাকৃত ফলাফল আনতে চলেছে।


2.a. intউপচে পড়া রূপান্তরিত করার সঠিক শর্তটি হল যুক্তিটি INT_MAX+1 এর চেয়ে বড় বা সমান । প্রতিসমভাবে, আন্ডারফ্লোর জন্য শর্তটি হ'ল আর্গুমেন্টটি কম বা INT_MIN-1 এর সমান ।
পাস্কেল কুয়াক

1
2.b. ভাসমান-পয়েন্ট থেকে পূর্ণসংখ্যায় রূপান্তরটির ওভারফ্লো হ'ল সি ++ এ অপরিজ্ঞাত আচরণ। এটি "শীর্ষস্থানীয় বিটগুলি বাদ দেওয়ার ফল দেয় না"। দেখুন (যদিও এটি সি এর জন্য লেখা হয়েছে): blog.frama-c.com/index.php?post/2013/10/09/…
পাসকেল কুয়াক

0

(int) xপূর্ণসংখ্যার অংশটি রাখার জন্য অনুরোধ x(এখানে কোনও বৃত্তাকার নেই)

fabs(x)= | এক্স | যাতে এটি >= 0;

প্রাক্তন: (int) -3.5আয় -3; fabs(-3.5)প্রত্যাবর্তন 3.5;

সাধারণভাবে, fabs (x) >= xসমস্ত এক্স জন্য;

x >= (int) x যদি x >= 0

x < (int) x যদি x < 0


x = -3 ফেবস (-3) = 3 (অন্তর্) -3 = -3; আমি মনে করি সর্বশেষ বৈষম্য ধরে আছে। কেন এটি ভুল বলে আপনি আরও বিস্তারিত বলতে পারেন?
পল হোয়াং

দুঃখিত, আমি বোঝাচ্ছি -3.5, আপনি যে উদাহরণ দিয়েছেন। -3> -3.5
ডেনিস জিকিফুজ

3
সর্বশেষ বিবৃতিটি এখনও "x <= int (x) x <0" হওয়া উচিত, এবং "x <(int) x যদি x <0" না হয়: negativeণাত্মক পূর্ণসংখ্যা একই থাকে।
টমাসজ গ্যান্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.