শাঁসগুলিতে লুপগুলি এড়িয়ে চলুন।
আপনি যদি গাণিতিক করতে চান তবে ব্যবহার করুন awk
বা bc
:
awk '
BEGIN{
for (i = 4.00; i < 5.42; i+ = 0.02)
print i
}'
অথবা
bc << EOF
for (i = 4.00; i < 5.42; i += 0.02) i
EOF
নোট করুন awk
(বিপরীতে bc
) আপনার প্রসেসরের সাথে double
ভাসমান পয়েন্ট নম্বর উপস্থাপনা (সম্ভবত আইইইই 754 প্রকার) এর সাথে কাজ করে। ফলস্বরূপ, যেহেতু এই সংখ্যাগুলি those দশমিক সংখ্যার দ্বিপাক্ষিক অনুমান, তাই আপনার কিছু চমক থাকতে পারে:
$ gawk 'BEGIN{for (i=0; i<=0.3; i+=0.1) print i}'
0
0.1
0.2
আপনি যদি একটি যুক্ত করেন OFMT="%.17g"
তবে নিখোঁজ হওয়ার কারণটি দেখতে পারেন 0.3
:
$ gawk 'BEGIN{OFMT="%.17g"; for (i=0; i<=0.5; i+=0.1) print i}'
0
0.10000000000000001
0.20000000000000001
0.30000000000000004
0.40000000000000002
0.5
bc
স্বেচ্ছাচারিত নির্ভুলতা না তাই এই ধরণের সমস্যা নেই।
নোট করুন যে ডিফল্টরূপে (যদি না আপনি আউটপুট ফর্ম্যাটটি পরিবর্তন করে OFMT
বা printf
স্পষ্ট বিন্যাসের নির্দিষ্টকরণের সাথে ব্যবহার না করেন), ভাসমান পয়েন্ট সংখ্যা প্রদর্শনের জন্য awk
ব্যবহার করে %.6g
, তাই 1000,000 এর উপরে ভাসমান পয়েন্ট সংখ্যাগুলির জন্য 1e6 এবং তারপরে স্যুইচ হবে এবং উচ্চ সংখ্যার জন্য ভগ্নাংশটি কেটে যাবে (100000.02 100000 হিসাবে প্রদর্শিত হবে)।
যদি আপনার সত্যিই শেল লুপটি ব্যবহার করতে হয়, কারণ উদাহরণস্বরূপ আপনি সেই লুপটির প্রতিটি পুনরাবৃত্তির জন্য নির্দিষ্ট কমান্ডগুলি চালাতে চান, হয় হয় ভাসমান পয়েন্টের পাটিগণিত সমর্থন সহ একটি শেল ব্যবহার করুন zsh
, yash
বা ksh93
উপরের মত একটি কমান্ডের সাথে মানগুলির তালিকা তৈরি করা উচিত (বা seq
উপলভ্য হলে) এবং এর আউটপুট লুপ করুন।
ভালো লেগেছে:
unset -v IFS # configure split+glob for default word splitting
for i in $(seq 4 0.02 5.42); do
something with "$i"
done
বা:
seq 4 0.02 5.42 | while IFS= read i; do
something with "$i"
done
আপনি যদি আপনার প্রসেসরের ভাসমান পয়েন্ট সংখ্যাগুলির সীমাটি না চাপেন তবে উপরের সংস্করণটির seq
চেয়ে ভাসমান পয়েন্টের আনুষঙ্গিকতায় আরও ত্রুটিপূর্ণভাবে পরিচালনা awk
করবে grace
আপনার যদি seq
(একটি জিএনইউ কমান্ড) না থাকে তবে আপনি একটি কার্যকারিতা হিসাবে আরও নির্ভরযোগ্য একটি করতে পারেন:
seq() { # args: first increment last
bc << EOF
for (i = $1; i <= $3; i += $2) i
EOF
}
এটি ভালো কাজের জন্য আরও ভাল কাজ করবে seq 100000000001 0.000000001 100000000001.000000005
। তবে মনে রাখবেন যে নির্বিচারে উচ্চ নির্ভুলতার সাথে সংখ্যা থাকা খুব বেশি কার্যকর হবে না যদি আমরা তাদেরকে যে কমান্ডগুলিতে সমর্থন করি না তাদের কাছে প্রেরণ করতে চলেছি।