كيفية إجراء حسابات النقطة العائمة في نصوص Bash في Linux

النقاط الرئيسية

  • يدعم غلاف Linux Bash فقط العمليات الحسابية الصحيحة ولا يمكنه إجراء حسابات على الأعداد العشرية.
  • تتيح لك أداة bc في Linux إجراء حسابات دقيقة للفاصلة العائمة بشكل تفاعلي وفي نصوص shell.
  • باستخدام bc، يمكنك تعيين عدد الأماكن العشرية التي سيتم عرضها وإجراء العمليات الحسابية بدقة تعسفية، بما في ذلك استخدام الوظائف من مكتبة الرياضيات القياسية.



يدعم غلاف Linux Bash العمليات الحسابية الصحيحة فقط. ولا يمكنه فهم أو التعامل مع حسابات الفاصلة العائمة. توفر لك أداة bc حسابات الفاصلة العائمة الدقيقة بشكل تفاعلي وفي نصوص غلاف.


لماذا يدعم Bash الأعداد الصحيحة فقط

قرار التصميم الأصلي لتقييد يونكسصدفة بورن إلى حساب صحيح قد إن هذا القرار قد يكون متجذراً في عملية ربط عدد صحيح ببايت واحد من ذاكرة الوصول العشوائي في بداية الحوسبة. وقد لا نعرف أبداً السبب الحقيقي وراء هذا القرار. ولا نعرف أيضاً لماذا اختارت نسخة لينكس من غلاف بورن، غلاف باش، أن تحذو حذوه.

لا يمكن لـ Bash بمفرده إجراء حسابات على أرقام ذات فاصلة عائمة، كما يتم الإبلاغ عن الحسابات على الأعداد الصحيحة التي قد يكون لها جزء كسري في الإجابة، كقيم عددية صحيحة مقطوعة. وهذا صحيح على سطر الأوامر وفي نصوص Bash shell. اعتمادًا على حالة الاستخدام الخاصة بك، قد يكون هذا مشكلة أو مربكًا.


يأتي Linux مع تطبيقين مساعدين يسمحان لك بإجراء حسابات الفاصلة العائمة. أحدهما هو dc. إنه غريب بعض الشيء، حيث يعمل كما هو الحال في تدوين البولندي العكسيالأداة الأخرى هي bc. ويمكن استخدامها بشكل تفاعلي أو كأمر، وهي الحل الذي سنناقشه هنا.

ذات صلة: 9 أمثلة لنصوص Bash

المشكلة

دعونا نجعل Bash يقسم ستة على ثلاثة.

echo $((6 / 3)) 
قسمة عددين صحيحين بدون باقي على سطر أوامر Bash

نحصل على الإجابة المتوقعة وهي اثنان. الآن دعنا نقسم ستة على سبعة. من الواضح أن الإجابة ستكون كسرية.

echo $((6 / 7)) 
قسمة عددين صحيحين على سطر أوامر Bash باستخدام الباقي الكسري. لا يتم عرض الباقي مطلقًا.


من الواضح أن الصفر خاطئ. دعنا نحاول مرة أخرى، بقسمة 16 على 7.

echo $((16 / 7)) 
توضيح المشكلة مع دعم BAsh فقط للحسابات الصحيحة عن طريق قسمة عددين صحيحين. يتم تجاهل الباقي الكسري.

نحصل على إجابة 2. ما يحدث هو أن الجزء الكسري من الإجابة يتم تجاهله، لذا يتم اقتطاع الإجابة. لم يكن هناك جزء كسري في المثال الأول، لذا نحصل على الإجابة الصحيحة.

لم يكن في المثال الثاني عنصر عدد صحيح في الإجابة، بل كان هناك جزء كسري فقط. ولأن الجزء الكسري تم تجاهله، فإن الإجابة التي نراها هي صفر.

في المثال الثالث، يتم تقسيم 7 إلى 16 مرتين، مع وجود باقي كسري. مرة أخرى، يتم تجاهل الباقي، ويتم اقتطاع النتيجة.

استخدام bc بشكل تفاعلي

بإمكانك استخدام bc كآلة حاسبة تفاعلية عن طريق كتابة bc والضغط على مفتاح “Enter”.


bc 
رسالة الترحيب والتوجيه من BC

يبدأ تطبيق bc في التشغيل، ويعلن عن رقم الإصدار الخاص به، ثم ينتظر إدخالك. يؤدي كتابة عملية حسابية والضغط على “Enter” إلى قيام bc بتقييم العملية الحسابية وعرض الإجابة.

16 * 4

1024 / 32

2^2 * 1024

ثلاثة أمثلة للحسابات في bc، في الوضع التفاعلي

يمكنك استخدام “Ctrl+L” لمسح الشاشة، و”Ctrl+D” للخروج من البرنامج. دعنا نحاول إجراء عملية حسابية تحتوي على مكون كسري في الإجابة.


22 / 7 
يتم تعيين bc افتراضيًا على عدم إظهار أي أرقام عشرية. يتم اقتطاع Pi إلى 3.

هذا ليس ما توقعناه. على عكس المتوقع، على الرغم من أن bc يسمح لنا باستخدام الدقة التعسفية، إلا أنه افتراضيًا لن يعرض النقطة العشرية أو أي أرقام تليها.

لكي نجعل الإجابة الصحيحة مرئية، نحتاج إلى إخبار bc بعدد الخانات العشرية التي يجب عرضها. نفعل ذلك باستخدام أمر “scale”. سنطلب سبعة خانات عشرية، ونعيد إجراء حساباتنا.

scale=7
22 / 7
استخدام المقياس لإخبار bc بإظهار ما يصل إلى 7 منازل عشرية في نتائج الحسابات


أخيرًا، وصلنا إلى مكان ما. يظل إعداد “المقياس” في مكانه حتى تقوم بتغييره. إن ضبط عدد الأماكن العشرية يخبرنا بأن الحد الأقصى عدد الأماكن المراد عرضها. إذا لم تكن الإجابة تحتاج إلى هذا العدد من الأماكن العشرية، فسيتم عرضها بعدد الأماكن العشرية المطلوبة وليس أكثر. ولا يتم حشوها بأصفار لا معنى لها.

scale=10
0.300003 * 0.5
يعرض bc فقط الأماكن العشرية التي يحتاجها. لن يؤدي ضبط المقياس إلى 10 إلى إجبارك على استخدام 10 أماكن عشرية. إذا كانت الإجابة تتطلب عددًا أقل من الأماكن العشرية، فستكون هذه الأماكن هي الوحيدة التي يتم عرضها.

يمكنك إدراج حسابات مختلفة على نفس السطر باستخدام الفاصلة المنقوطة “;” لفصلها. يتم عرض الإجابات على السطر كالمعتاد، بالترتيب الذي تم إدراج الحسابات به.


25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9 
بإمكانك إضافة حسابات متعددة إلى سطر واحد عن طريق فصلها بفاصلة منقوطة.

يمكنك أيضًا تضمين الأمر “scale” في القائمة.

scale=8; 22 / 7; scale=3; 0.3 * 0.071 
يمكنك تغيير إعداد المقياس لكل عملية حسابية، حتى العمليات الحسابية على نفس سطر الأوامر

المكتبة القياسية للرياضيات

يؤدي الخيار -l (مكتبة الرياضيات القياسية) إلى قيام bc بتحميل مجموعة من الوظائف، وتعيين “المقياس” إلى 20 مكانًا عشريًا.

bc -l
22 / 7
تم تشغيل bc باستخدام الخيار -l، مما يظهر قيمة pi محسوبة إلى 20 رقمًا عشريًا

بعد تحميل المكتبة القياسية، يمكنك استخدام هذه الوظائف في حساباتك.


  • س(س):جيب x
  • ج(س):جيب تمام x.
  • أ(x):ظل الزاوية لـ x
  • ل(س):اللوغاريتم الطبيعي لـ x
  • السابق):أسّ e للقيمة x
  • ج(ن،س):دالة ​​بيسل من رتبة عدد صحيح n من x.

تستخدم الجيب وجيب التمام والظل العكسي قيم الراديان.

s (1.1)
 
c (.891207)
 
a (.628473)
حساب الجيب وجيب التمام والظل العكسي في bc في الوضع التفاعلي

إرسال الإدخال إلى bc على سطر الأوامر

يمكنك استخدام إعادة التوجيه والأنابيب لإرسال المدخلات إلى bc. يقوم بمعالجة المدخلات الخاصة بك ويعرض الإجابة في نافذة المحطة الطرفية.

يمكنك إعادة التوجيه إلى bc مع أو بدون خيار -l (مكتبة الرياضيات القياسية).

bc <<< 22/7
bc -l <<< 22/7
إعادة توجيه المدخلات إلى bc و bc -l


لتوجيه الإدخال إلى bc، يجب أن يكون الإدخال عبارة عن إخراج لعملية أخرى. من الملائم استخدام echo لهذا الغرض.

echo 22/7 | bc
echo 22/7 | bc -l
استخدام صدى الصوت لتوجيه الإدخال إلى bc وbc -l

إذا كان لديك مسافات في إدخالك، أو كنت تريد تضمين أمر “scale”، فقم بوضع إدخالك بين علامتي اقتباس.

echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc
تغليف المدخلات التي تتضمن مسافات بين علامات اقتباس لتوجيهها إلى bc وbc -l

استخدام bc في نصوص Bash Shell

لدينا الآن كل ما نحتاجه لنتمكن من إجراء حسابات الفاصلة العائمة في نصوص bash الخاصة بنا، بالدقة التي نختارها. يمكننا أيضًا الرجوع إلى متغيرات Bash في حساباتنا، بما في ذلك المعلمات الخاصة بالنص.


إليك نص المثال الخاص بنا. انسخ هذا النص إلى محرر، واحفظه باسم “pi.sh”، ثم أغلق محرر النصوص الخاص بك.

#!/bin/bash

first_number=22
second_number=7

pi=$(echo "scale=$1; $first_number/$second_number" | bc)

echo "Pi to $1 decimal places is: $pi"

نستخدم متغيرين، “first_number” و”second_number” لحفظ قيمتين عدديتين. نستخدم هذين المتغيرين في المدخلات التي ننقلها إلى bc.

لقد استخدمنا أيضًا معلمة سطر الأوامر الأولى التي تم تمريرها إلى البرنامج النصي، “$1″، كقيمة لتعيين “المقياس” إليها.

قبل أن نتمكن من تجربة البرنامج النصي الخاص بنا، نحتاج إلى جعله قابلاً للتنفيذ باستخدام chmod.

chmod +x pi.sh 
استخدام chmod لجعل البرنامج النصي قابلاً للتنفيذ

دعنا نحاول استخدام البرنامج النصي الخاص بنا مع قيم سطر أوامر مختلفة.


./pi.sh 5
./pi.sh 14
./pi.sh 20
إخراج من البرنامج النصي pi.sh يظهر قيمة pi المحسوبة بثلاث درجات دقة مختلفة

نحصل على عرض pi لعدد الأماكن التي نحددها على سطر الأوامر في البرنامج النصي الخاص بنا.

ذات صلة: كيفية استخدام getopts لتحليل خيارات Linux Shell Script

كل هذا يضيف

إن تجاوز حدود الرياضيات الصحيحة فقط في Bash يمنح نصوصنا الدقة والوضوح.

يعد استخدام echo لتوجيه الإدخال إلى bc داخل البرامج النصية أمرًا صعبًا بعض الشيء، ولكنه يعمل بشكل جيد للغاية، والفوائد تستحق ذلك.

أضف تعليق