ম্যাথ.ফ্লুর কেন ডাবল ফিরিয়ে দেয়?


103

অফিসিয়াল জাভাদোক বলে যে এটি একটি "গাণিতিক পূর্ণসংখ্যার সমান" Math.floor()ফেরত দেয় doubleতবে তার কেন এটি ফেরত দেওয়া উচিত নয় int?

উত্তর:


80

একই জাভাদোক অনুসারে:

যুক্তিটি যদি NaNকোনও অসীম বা ধনাত্মক শূন্য বা নেতিবাচক শূন্য হয় তবে ফলাফলটি যুক্তির মতো the একটি দিয়ে এটি করতে পারে না int

বৃহত্তম doubleমানটি বৃহত্তম থেকেও বড় int, তাই এটি হতে হবে long


40
ম্যাথের সাথে অসঙ্গত বলে মনে হচ্ছে ound
zod

1
লক্ষ্য করুন Javadoc এটা ফেরৎ বলছেন "বৃহত্তম (ধনাত্মক অনন্ত নিকটস্থ) * ফ্লোটিং পয়েন্ট মান * যে কম বা যুক্তি সমান এবং একটি গাণিতিক পূর্ণসংখ্যা সমান" । একটি মান x> 2 ^ 53 দেওয়া হয়েছে যা এর ভগ্নাংশের অংশ কেটে দেওয়া মানের মতো হবে না। এটির তুলনায় এটি বেশ খানিকটা ছোট হতে পারে।
জিম গ্যারিসন

16

এটি নির্ভুলতার জন্য ডাবল ডেটা টাইপের একটি 53 বিট ম্যান্টিসা রয়েছে। অন্যান্য জিনিসগুলির মধ্যে এর অর্থ যা একটি ডাবল সম্পূর্ণ নির্ভুলতা ক্ষতি ছাড়াই 2 represent 53 পর্যন্ত উপস্থাপন করতে পারে।

আপনি যদি একটি পূর্ণসংখ্যার মধ্যে এত বড় সংখ্যক সঞ্চয় করেন তবে আপনি একটি ওভারফ্লো পাবেন। পূর্ণসংখ্যার কেবল 32 বিট থাকে।

পূর্ণসংখ্যাটিকে দ্বিগুণ হিসাবে ফিরিয়ে দেওয়া এখানে সঠিক জিনিস কারণ এটি একটি পূর্ণসংখ্যার চেয়ে অনেক বেশি বিস্তৃত ব্যবহারকারীর সংখ্যা-সীমা সরবরাহ করে।


অবশ্যই এই ধরণের মানগুলির সাথে লড়াই করতে দীর্ঘ সময় আসতে পারে। আপনি এখনও ডাবলস> 2 ^ 63 এর সাথে কী করবেন তা নিয়ে কাজ করতে হবে।
জন স্কিটি

1
@ জোন, সত্য, তবে এটির ফলে একটি পারফরম্যান্স প্রভাব পড়বে (যে বিষয়ে আমি অবগত রয়েছি এমন কোনও নির্দেশিকা সেট থেকে দ্বিগুণ থেকে কোনও রূপান্তর নির্দেশনা নেই)। আমি ভাবছি ম্যাথ.ফ্লুর প্রথম স্থানে ডাবল> 2 with 53 দিয়ে কী করে। কিছু ফলাফল প্রতিনিধিত্বমূলক নয়।
নীল পিপেনব্রিংক

তবে, সিউডো-আইডিয়োমেটিক ফর্ম (ইনট) ম্যাথ.ফ্লুয়ার (ফু), যা সরকারী জাভাদকেও প্রদর্শিত হবে তা অনিরাপদ যেহেতু ফলাফলটি কোনও ইনট-এর সাথে খাপ খায় না, আমি কি ঠিক আছি? এবং তারপরে আবার ম্যাথ.ফ্লুর ব্যবহারের জন্য কোন নিরাপদ ফর্ম, যেহেতু ফলাফলটি দীর্ঘায়িতও হতে পারে না?
রায়বাজ

10

অন্যরা কেন আপনাকে বলেছে, আপনি কী করতে চাইলে সঠিকভাবে কীভাবে গোল করবেন তা আমি আপনাকে বলছি। আপনি যদি কেবল ইতিবাচক সংখ্যা ব্যবহার করতে চলেছেন তবে আপনি এই বিবৃতিটি ব্যবহার করতে পারেন:

int a=(int) 1.5;

যাইহোক, (int) সর্বদা 0 এর দিকে ঘুরবে Thus সুতরাং, যদি আপনি একটি নেতিবাচক সংখ্যা করতে চান:

int a=(int) -1.5; //Equal to -1

আমার ক্ষেত্রে, আমি এটি করতে চাইনি। রাউন্ডিং করতে আমি নীচের কোডটি ব্যবহার করেছি এবং দেখে মনে হচ্ছে এটি সমস্ত প্রান্তের কেসগুলি ভালভাবে পরিচালনা করে:

private static long floor(double a)
{
    return (int) Math.floor(a);
}

7
কেন ব্যবহার (int) Math.floor(a)করবেন না ? এটি সম্ভবত আরও দক্ষ এবং এটি আরও খাটো।
সলোমন উকো

@ সলোমন ইউকো আপনার পরিবর্তে (int) Math.floor(a)কেবল লিখতে (int) aপারেন, যদি কোনও ইতিবাচক হয়।
লিও লিওনতেভ

3

আপনি যদি এটি বৃহত্তম ইনট বা লম্বার চেয়ে দ্বিগুণ বড় উপহার দেন তবে আপনি এটি কী ফিরিয়ে দিতে চান?

(স্বীকারযোগ্যভাবে যদি এটি বৃহত্তম দীর্ঘের চেয়ে বৃহত্তর হয় তবে যেহেতু যথার্থতা কম হবে - এটি নিকটতম তাত্ত্বিক পূর্ণসংখ্যার হতে পারে না - তবে তবুও ...)


0

জাভাতে যেমন একটি পূর্ণসংখ্যা এবং ভাসমান পয়েন্ট বিভাগ রয়েছে তেমনি মেঝে করার পূর্ণসংখ্যা এবং ভাসমান পয়েন্ট রয়েছে:

double f = Math.floor(x);

অথবা

int k = (int) x; 

তবে আপনার সীমাবদ্ধ সুনির্দিষ্ট পাটিগণিত সহ মেঝে ব্যবহারের ক্ষেত্রে সর্বদা সতর্ক হওয়া দরকার: আপনার x এর গণনাতে 1.99999999 এর মতো কিছু পাওয়া যেতে পারে যা উভয় রূপের দ্বারা 2 না হয়ে 1 তে ভাসবে। এখানে অনেকগুলি অ্যালগরিদম রয়েছে যা কিছু ইনপুট মানগুলির জন্য ভুল ফলাফল এড়াতে এই সীমাবদ্ধতার চারপাশে কাজ করা দরকার।


0

সুতরাং সেই ত্রুটি এবং অন্যান্য অ-পূর্ণসংখ্যার মানগুলি গণনার একটি সিরিজের মাধ্যমে সঠিকভাবে ক্যাসকেড করতে পারে।

উদাহরণস্বরূপ, আপনি যদি ম্যাথ.ফ্লুয়ারে নং নম্বর (এনএএন) খাওয়ান, এটি এটি পাস করবে।

যদি এটি পূর্ণসংখ্যায় ফিরে আসে তবে এটি এই স্থিতিগুলি বা ত্রুটিগুলি পাশ করতে পারে না এবং আপনি আগের গণনা থেকে খারাপ ফলাফল পেতে পারেন যা দেখতে ভাল তবে আরও প্রক্রিয়া করার পরেও ভুল are

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