এই কোড:
System.out.println(Math.abs(Integer.MIN_VALUE));
ফিরে আসে -2147483648
এটি কি পরম মান হিসাবে ফেরত দেওয়া উচিত নয় 2147483648
?
এই কোড:
System.out.println(Math.abs(Integer.MIN_VALUE));
ফিরে আসে -2147483648
এটি কি পরম মান হিসাবে ফেরত দেওয়া উচিত নয় 2147483648
?
উত্তর:
Integer.MIN_VALUE
হয় -2147483648
, তবে 32 বিট পূর্ণসংখ্যার সমন্বিত সর্বোচ্চ মানটি +2147483647
। +2147483648
32 বিট ইনট্রে উপস্থাপনের চেষ্টা কার্যকরভাবে "রোল ওভার" হয়ে যাবে -2147483648
। কারণ এটি স্বাক্ষরিত পূর্ণসংখ্যাগুলি ব্যবহার করার সময়, দু'জনের পরিপূরক বাইনারি উপস্থাপনা +2147483648
এবং -2147483648
অভিন্ন। +2147483648
সীমা ছাড়াই বিবেচিত এটি কোনও সমস্যা নয় ।
এই বিষয়ে আরও কিছু পড়ার জন্য, আপনি টু এর পরিপূরক সম্পর্কিত উইকিপিডিয়া নিবন্ধটি পরীক্ষা করে দেখতে চাইতে পারেন ।
আপনি যে আচরণটি নির্দেশ করেছেন তা প্রকৃতপক্ষে, পাল্টা স্বজ্ঞাত। যাইহোক, এই আচরণটি জাভাদোকMath.abs(int)
দ্বারা নির্দিষ্ট করাগুলির জন্য :
যুক্তিটি নেতিবাচক না হলে যুক্তিটি ফিরে আসে। যুক্তিটি নেতিবাচক হলে, যুক্তির অবহেলা ফিরে আসে।
এটি হ'ল Math.abs(int)
নিম্নলিখিত জাভা কোডের মতো আচরণ করা উচিত:
public static int abs(int x){
if (x >= 0) {
return x;
}
return -x;
}
যে, নেতিবাচক ক্ষেত্রে -x
,।
জেএলএস বিভাগ 15.15.4 অনুসারে , -x
সমান (~x)+1
, যেখানে ~
বিটওয়াইস পরিপূরক অপারেটর।
এটি ঠিক আছে কিনা তা যাচাই করতে, উদাহরণ হিসাবে উদাহরণস্বরূপ -1 নিই।
পূর্ণসংখ্যার মানটি জাভাতে হেক্সাডেসিমাল -1
হিসাবে উল্লেখ করা যেতে পারে 0xFFFFFFFF
(এটি কোনও println
বা অন্য কোনও পদ্ধতিতে পরীক্ষা করে দেখুন)। -(-1)
এইভাবে গ্রহণ করা দেয়:
-(-1) = (~(0xFFFFFFFF)) + 1 = 0x00000000 + 1 = 0x00000001 = 1
সুতরাং, এটি কাজ করে।
আসুন এখন দিয়ে চেষ্টা করা যাক Integer.MIN_VALUE
। সর্বনিম্ন পূর্ণসংখ্যার দ্বারা প্রতিনিধিত্ব করা যেতে পারে তা জেনে 0x80000000
, প্রথম বিটটি 1 এ সেট হয় এবং 31 টি বিট 0 সেট করে, আমাদের কাছে:
-(Integer.MIN_VALUE) = (~(0x80000000)) + 1 = 0x7FFFFFFF + 1
= 0x80000000 = Integer.MIN_VALUE
আর এই কেন Math.abs(Integer.MIN_VALUE)
আয় Integer.MIN_VALUE
। এছাড়াও মনে রাখবেন 0x7FFFFFFF
হয় Integer.MAX_VALUE
।
এটি বলেছিল, ভবিষ্যতে এই প্রতি-স্বজ্ঞাত রিটার্ন মানের কারণে আমরা কীভাবে সমস্যাগুলি এড়াতে পারি?
@ বোম্বের নির্দেশ অনুসারে আমরা আমাদের এসটিকে আগে ফেলে int
দিতে পারি long
। আমাদের অবশ্য হয়
int
গুলি করে দিন, যা কাজ করে না
Integer.MIN_VALUE == (int) Math.abs((long)Integer.MIN_VALUE)
।long
একরকম আশা করে চালিয়ে যাও যে আমরা কখনই তার Math.abs(long)
সমান মান নিয়ে কল করব না Long.MIN_VALUE
, যেহেতু আমাদেরও রয়েছে Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE
।আমরা BigInteger
যে BigInteger.abs()
কোনও জায়গায় ব্যবহার করতে পারি , কারণ সত্যই সর্বদা একটি ইতিবাচক মান দেয়। এটি একটি ভাল বিকল্প, যদিও কাঁচা পূর্ণসংখ্যার ধরণের হস্তক্ষেপের তুলনায় কিছুটা ধীর।
আমরা এর জন্য আমাদের নিজস্ব র্যাপারটি লিখতে পারি Math.abs(int)
:
/**
* Fail-fast wrapper for {@link Math#abs(int)}
* @param x
* @return the absolute value of x
* @throws ArithmeticException when a negative value would have been returned by {@link Math#abs(int)}
*/
public static int abs(int x) throws ArithmeticException {
if (x == Integer.MIN_VALUE) {
// fail instead of returning Integer.MAX_VALUE
// to prevent the occurrence of incorrect results in later computations
throw new ArithmeticException("Math.abs(Integer.MIN_VALUE)");
}
return Math.abs(x);
}
int positive = value & Integer.MAX_VALUE
(মূলত থেকে সজল Integer.MAX_VALUE
করার 0
পরিবর্তে Integer.MIN_VALUE
)চূড়ান্ত নোট হিসাবে, এই সমস্যাটি কিছু সময়ের জন্য পরিচিত বলে মনে হচ্ছে। উদাহরণস্বরূপ সম্পর্কিত ফাইন্ডবগ বিধি সম্পর্কে এই এন্ট্রিটি দেখুন ।
আপনি যে ফলাফলটি প্রত্যাশা করছেন তা দেখতে, কাস্ট Integer.MIN_VALUE
করুন long
:
System.out.println(Math.abs((long) Integer.MIN_VALUE));
Math.abs
নেতিবাচক সংখ্যাটি ফিরিয়ে Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE
ArithmeticException
? এছাড়াও, আচরণটি এপিআই ডকুমেন্টেশনে স্পষ্টতই নথিভুক্ত করা হয়েছে।
Math.abs(long)
। আমি এখানে আমার ভুলের জন্য ক্ষমা চাইছি: আমি চেষ্টা করেছিলাম যে আপনি Math.abs(long)
একটি সমাধান হিসাবে ব্যবহারের প্রস্তাব করেছিলেন , যখন আপনি "প্রশ্নকারী প্রত্যাশা করছেন ফলাফলটি দেখার" এটি একটি সহজ উপায় হিসাবে দেখিয়েছেন। দুঃখিত
জাভাতে এটির একটি সমাধান রয়েছে 15 এটি ইনট এবং দীর্ঘ পদ্ধতি হবে method তারা ক্লাসে উপস্থিত হবে
java.lang.Math and java.lang.StrictMath
পদ্ধতিগুলি।
public static int absExact(int a)
public static long absExact(long a)
পাস করলে
Integer.MIN_VALUE
বা
Long.MIN_VALUE
একটি ব্যতিক্রম নিক্ষেপ করা হয়।
https://bugs.openjdk.java.net/browse/JDK-8241805
আমি দেখতে চাই যে লম্বা.এম.এ.ভি.এল.এইউ বা পূর্ণসংখ্যা। এম.এক্স.এল.এল.এল.কে পাস করার পরে একটি ইতিবাচক মানটি ফিরে আসবে এবং ব্যতিক্রম নয়।
ম্যাথ.এবসগুলি বড় সংখ্যা সহ সব সময় কাজ করে না আমি এই ছোট কোড যুক্তিটি ব্যবহার করি যা আমি যখন 7 বছর বয়সে শিখেছিলাম!
if(Num < 0){
Num = -(Num);
}
s
এখানে কি ?
Num
সমান হলে এই ফলাফলটি কী Integer.MIN_VALUE
ঘটবে?