বাশ পাটিগণিতের গণনাতে ভাগ কেন 0 শতাংশ হিসাবে সবচেয়ে বেশি?


15

কোনও স্ক্রিপ্টের জন্য বাশ প্রত্নতত্বের চেষ্টা করা হচ্ছে, তবে $eশেষ পর্যন্ত আপডেট হয় না। আউটপুট নিজেই কথা বলে।

max=5
for e in $(seq 1 1 $max); do 
    percent=$(( $e/$max*100 ))
    echo "echo $e / $max : = $percent"
done

টিএল; ডিআর: শতাংশ হিসাবে ১.৫ প্রদর্শন করুন।

আউটপুট:

echo 1 / 5 : = 0
echo 2 / 5 : = 0
echo 3 / 5 : = 0
echo 4 / 5 : = 0
echo 5 / 5 : = 100

কেন?


1
সম্পর্কিত: বাশ গণনা সম্পাদন করার সময় ইনপুট নির্বিশেষে আউটপুট হিসাবে কেবল পূর্ণসংখ্যা দেয় (যদিও এখানে বর্ণিত সমস্যাটির বিপরীতে এটি অপারেশনগুলিকে পুনরায় সাজানোর মাধ্যমে সমাধান করা যায় না))
এলিয়াহ কাগন

উত্তর:


24

bashঅ-পূর্ণসংখ্যার গাণিতিক পরিচালনা করতে পারে না। যতক্ষণ না সমস্ত অভিব্যক্তি পূর্ণসংখ্যা হয় এটি আপনাকে সঠিক ফলাফল দেয়। সুতরাং আপনার গণনার কোথাও কোনও অ-পূর্ণসংখ্যার মান পাওয়া এড়াতে হবে।

আপনার ক্ষেত্রে, যখন আপনি মূল্যায়ন করছেন 1 / 5, 2 / 5ইত্যাদি it এটি কিছু অ-পূর্ণসংখ্যার মানগুলির সাথে বশ চিঠিপত্রের সাথে পূর্ণসংখ্যার শূন্য মান তৈরি করে এবং ফলাফল সেই অনুযায়ী শূন্য হতে প্রকাশিত হয়। বিভাগ এবং গুনের অগ্রাধিকার একই এবং একই নজির অপারেটরগুলি সর্বদা বাম থেকে ডানদিকে চালিত হয় কারণ সেগুলি এক্সপ্রেশনতে স্থাপন করা হয়।

চারপাশের একটি কাজ হ'ল প্রথমে গুণ করা এবং তারপরে বিভাজনটি কখনই অ-পূর্ণসংখ্যার মানটি পরিচালনা করতে হয় না। সংশোধন করা এক্সপ্রেশন হবে,

$ max=5; for e in $(seq 1 1 $max); do percent=$(( $e*100/$max )); echo "echo $e / $max : = $percent"; done
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100

1
Subexpression 1/5একটি অ-পূর্ণসংখ্যার মান তৈরি করে না । এটি পূর্ণসংখ্যা মান তৈরি করে 0, যেহেতু 1 দ্বারা 5 এর পূর্ণসংখ্যা বিভাগের ফলাফল 0 হয়। পরবর্তী ক্রিয়াকলাপগুলি সফলভাবে সেই মানটির ব্যবহার করে 0। এটি ওপি যা চেয়েছিল তা নয়, তবে কোনও অপারেশন অ-পূর্ণসংখ্যার মান তৈরি করে না এবং কোনও অপারেশন ব্যর্থ হয়।
এলিয়াহ কাগন

@ এলিয়াকাগান ত্রুটিটি চিহ্নিত করার জন্য আপনাকে ধন্যবাদ। সম্পাদনা করা হয়েছে।
সৌরভসি

16

বাশ এই ধরণের পাটিগণিত খুব ভাল কাজ করে না ... আপনার সমস্যাটি এখানে:

$ echo $((1/5))
0
$ echo $((2/5))
0
$ echo $((4/5))
0
$ echo $((4/5))
0

আপনার যদি অ-পূর্ণসংখ্যার মানগুলি পরিচালনা করতে হয় তবে আপনি ব্যবহার করতে পারেন bc

$ max=5; for e in $(seq 1 1 "$max"); do percent=$(bc <<< "scale=1 ; $e/$max*100") ; echo "echo $e / $max : = ${percent%.*}"; done
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100

(আউটপুটটিকে পূর্ণসংখ্যার আকারে কীভাবে বিন্যাস করতে হয় তা নির্দেশ করার জন্য @ অ্যারোনিকালকে ধন্যবাদ)


আমি অবশ্যই এটি একবার দেখতে হবে, আবার একবার ধন্যবাদ!
সাইবেেক্স

1
আপনি আপনার প্রতিধ্বনিতে .0পরিবর্তন করে আউটপুট থেকে ট্রিম করতে পারেন :)$percent${percent%.*}
অ্যারোনিকাল

11

বাশের বিপরীতে, এডকে সম্পূর্ণ ভাসমান পয়েন্ট পাটিগণিত সরবরাহ করে। উদাহরণ স্বরূপ:

$ awk -v max=5 'BEGIN{for (e=1;e<=max;e++) print "echo " e " / " max " : = " 100*e/max}' 
echo 1 / 5 : = 20
echo 2 / 5 : = 40
echo 3 / 5 : = 60
echo 4 / 5 : = 80
echo 5 / 5 : = 100

5

চেষ্টা

percent=$(( $e*100/$max ))

:)

এর বিভাগীয় মূল্যায়ন মূল্যায়ন বিভাগটি দেখুন:

man bash

এটি কেবল পূর্ণসংখ্যা সমর্থন করে।

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