বাশে আমি কীভাবে ভাসমান-পয়েন্ট বিভাগ ব্যবহার করব?


242

আমি বাশ স্ক্রিপ্টে দুটি চিত্রের প্রস্থকে বিভক্ত করার চেষ্টা করছি, তবে বাশ আমাকে 0ফলাফল হিসাবে দিয়েছে:

RESULT=$(($IMG_WIDTH/$IMG2_WIDTH))

আমি বাশ গাইডটি অধ্যয়ন করেছি এবং আমি জানি যে তাদের ব্যবহার করা উচিত bcইন্টারনেটের সমস্ত উদাহরণে usebc। ইন echoআমার একই জিনিস লাগাতে চেষ্টা SCALEএটা কাজ করে নি কিন্তু।

টিউটোরিয়ালে আমি যে উদাহরণটি পেয়েছি তা এখানে:

echo "scale=2; ${userinput}" | bc 

আমি কীভাবে বাশকে আমার মতো একটি ভাসা দিতে পারি 0.5?


9
আপনার স্ক্রিপ্টে ফ্লোটিং পয়েন্ট গাণিতিক করার চেষ্টা করছেন এমন প্রত্যেকের জন্য একটি মন্তব্য, নিজেকে জিজ্ঞাসা করুন: আমার কি সত্যিই ভাসমান পয়েন্ট গণিতের প্রয়োজন? কখনও কখনও আপনি সত্যিই ছাড়া পেতে পারেন। উদাহরণস্বরূপ, বাশফ্যাঙ্কা / 022 এর শেষ অংশটি দেখুন ।
gniourf_gniourf

উত্তর:


242

আপনি পারবেন না। বাশ শুধুমাত্র পূর্ণসংখ্যার হয়; আপনাকে অবশ্যই কোনও সরঞ্জামে প্রতিনিধি দিতে হবেbc


8
উত্তরকে RESULT ভেরিয়েবলে রাখার জন্য আমি কীভাবে বিসির মতো একটি সরঞ্জাম উপস্থাপন করতে পারি?
মেদ্যা ঘো

2
সুতরাং আপনার অর্থ VAR = $ (প্রতিধ্বনি "স্কেল = 2; $ (($ IMG_WIDTH / $ IMG2_WIDTH))" | বিসি) এর মতো?
মেদ্যা ঘো

54
@ শেভিন VAR=$(echo "scale=2; $IMG_WIDTH/$IMG2_WIDTH" | bc)বা VAR=$(bc <<<"scale=2;$IMG_WIDTH/$IMG2_WIDTH")$ (()) ছাড়াই (ডাবল বন্ধনী); কমান্ড কার্যকর করার আগে বাশ দ্বারা এটি প্রসারিত করা হয়েছে
নাহুয়েল ফিউইলুল

4
সত্য, তবে awk সাধারণত সিস্টেমে ইতোমধ্যে ইনস্টল হওয়ার সম্ভাবনা বেশি থাকে।
সিএমসিডিগ্রাগনকাই

9
আপনার কাছে এখানে সেরা উত্তর রয়েছে ille সত্যই এর নিজস্ব উত্তর হওয়া উচিত, এবং উত্তর হিসাবে গ্রহণ করা উচিত। এই নির্দিষ্ট লাইনটি অবিশ্বাস্যরূপে দরকারী ছিল: VAR = $ (বিসি <<< "স্কেল = 2; $ আইএমজি_উইউডিটিএইচ / $ আইএমজি 2_WIDTH")
ডেভিড

197

তুমি এটি করতে পারো:

bc <<< 'scale=2; 100/3'
33.33

আপডেট 20130926 : আপনি ব্যবহার করতে পারেন:

bc -l <<< '100/3' # saves a few hits

8
... এবং বহু অঙ্ক যুক্ত করে। কমপক্ষে আমার মেশিনে এই ইয়েলগুলি 33.3333333333333333333333 যখন প্রাক্তন 33.33 দেয়।
আন্দ্রেয়াস স্পিন্ডার

12
@ আন্ড্রেসস্পিন্ডার কোনও পুরানো পোস্টের মতো, তবে যে কেউ যদি জানতে চান, স্কেল কমান্ড যেমন প্রয়োগ করে এটি পরিবর্তন করা যেতে পারে। bc -l <<< 'scale=2; 100/3'
মার্টি

আপনি স্কেল = 0 ব্যবহার করে ব্যাশের পরে ব্যবহারের জন্য কোনও পূর্ণসংখ্যার আশা করছেন কিনা তা সন্ধান করুন। V1.06.95 হিসাবে, বিসি, কোনও কারণে, যখন ইনপুট সংখ্যার দশমিক অংশ থাকে তখন স্কেল পরিবর্তনশীলটিকে উপেক্ষা করে। সম্ভবত এটি ডক্সগুলিতে রয়েছে তবে আমি এটি খুঁজে পেলাম না। চেষ্টা করুন: প্রতিধ্বনি $ (বিসি-এল <<< 'স্কেল = 0; 1 * 3.3333')
গ্রেগ বেল

1
@ গ্রেগবেল দ্য ম্যান পেজটি জানিয়েছে Unless specifically mentioned the scale of the result is the maximum scale of the expressions involved.এবং /অপারেটরের জন্য একটি অতিরিক্ত নোট রয়েছে :The scale of the result is the value of the variable scale.
গীতসংহিতা

2
ধন্যবাদ @ পিএসসি। মজার বিষয়, এর জন্য / এটি বলেছে যে "ফলাফলের স্কেলটি হল ভেরিয়েবল স্কেলের মান" তবে গুণের ক্ষেত্রে তা নয়। আমার ভাল উদাহরণ: bc <<< 'scale=1; 1*3.00001' স্কেল সত্যিই কিছু কারণে 5 টি, bc <<< 'scale=1; 1/3.000001' স্কেল 1. মজার ব্যাপার হল, 1 এটা সরাসরি সেটে দ্বারা বিভাজক: bc <<< 'scale=1; 1*3.00001/1'স্কেল 1
গ্রেগ বেল

136

সজোরে আঘাত

অন্যদের দ্বারা উল্লিখিত হিসাবে, bash ভাসমান পয়েন্ট গণিত সমর্থন করে না, যদিও আপনি এটি নির্দিষ্ট দশমিক ট্রিক্রি দিয়ে উদাহরণস্বরূপ দুটি দশমিকের সাথে জাল করতে পারেন:

echo $(( 100 * 1 / 3 )) | sed 's/..$/.&/'

আউটপুট:

.33

দেখা Nilfred এর উত্তরঅনুরূপ তবে আরও সংক্ষিপ্ত পদ্ধতির জন্য ।

বিকল্প

উল্লিখিত bcএবং ছাড়াওawk বিকল্পের নিম্নলিখিতগুলিও রয়েছে:

clisp

clisp -x '(/ 1.0 3)'

পরিষ্কার আউটপুট সহ:

clisp --quiet -x '(/ 1.0 3)'

বা স্টিডিনের মাধ্যমে:

echo '(/ 1.0 3)' | clisp --quiet | tail -n1

ডিসি

echo 2k 1 3 /p | dc

প্রতিভা ক্লাইট ক্যালকুলেটর

echo 1/3.0 | genius

Ghostscript

echo 1 3 div = | gs -dNODISPLAY -dQUIET | sed -n '1s/.*>//p' 

gnuplot

echo 'pr 1/3.' | gnuplot

jq

echo 1/3 | jq -nf /dev/stdin

বা:

jq -n 1/3

ksh

echo 'print $(( 1/3. ))' | ksh

Lua

lua -e 'print(1/3)'

বা স্টিডিনের মাধ্যমে:

echo 'print(1/3)' | lua

ম্যাক্সিমা

echo '1/3,numer;' | maxima

পরিষ্কার আউটপুট সহ:

echo '1/3,numer;' | maxima --quiet | sed -En '2s/[^ ]+ [^ ]+ +//p'

নোড

echo 1/3 | node -p

অষ্টক

echo 1/3 | octave

Perl

echo print 1/3 | perl

python2

echo print 1/3. | python2

python3

echo 'print(1/3)' | python3

আর

echo 1/3 | R --no-save

পরিষ্কার আউটপুট সহ:

echo 1/3 | R --vanilla --quiet | sed -n '2s/.* //p'

চুনি

echo print 1/3.0 | ruby

wcalc

echo 1/3 | wcalc

পরিষ্কার আউটপুট সহ:

echo 1/3 | wcalc | tr -d ' ' | cut -d= -f2

zsh

echo 'print $(( 1/3. ))' | zsh

ইউনিট

units 1/3

কমপ্যাক্ট আউটপুট সহ:

units --co 1/3

অন্যান্য উত্স

স্টাফেন চেজেলাস ইউনিক্স.এসএক্স-তে একই জাতীয় প্রশ্নের উত্তর দিয়েছিলেন।


9
দুর্দান্ত উত্তর। আমি জানি এটি প্রশ্নের কয়েক বছর পরে পোস্ট করা হয়েছিল তবে এটি গ্রহণযোগ্য উত্তর হওয়ার চেয়ে বেশি প্রাপ্য।
ব্রায়ান ক্লাইন

2
যদি আপনার কাছে zsh উপলভ্য থাকে তবে আপনার স্ক্রিপ্টটি বাশের পরিবর্তে zsh এ লিখতে হবে
Andrea Corbellini

থামুন আপ gnuplot জন্য :)
অ্যান্ডওয়াইকো

সুন্দর তালিকা। বিশেষত echo 1/3 | node -pসংক্ষিপ্ত।
জনি ওয়াং

39

মার্ভিনের উত্তরটি একটু উন্নত করা:

RESULT=$(awk "BEGIN {printf \"%.2f\",${IMG_WIDTH}/${IMG2_WIDTH}}")

বিসি সর্বদা ইনস্টল করা প্যাকেজ হিসাবে আসে না।


4
আরওপি স্ক্রিপ্টটির exitএটির ইনপুট স্ট্রিম থেকে পড়া থেকে আটকাতে একটি দরকার । আমি -vঝুঁকিপূর্ণ টুথপিক সিন্ড্রোম প্রতিরোধ করার জন্য awk এর পতাকা ব্যবহার করার পরামর্শ দিই সুতরাং:RESULT=$(awk -v dividend="${IMG_WIDTH}" -v divisor="${IMG2_WIDTH}" 'BEGIN {printf "%.2f", dividend/divisor; exit(0)}')
aecolley

2
এটি করার আরও একটি অবাক করার উপায় হ'ল ইনপুট স্ট্রিম থেকে যুক্তিগুলি পড়া RESULT=$(awk '{printf("result= %.2f\n",$1/$2)}' <<<" $IMG_WIDTH $IMG2_WIDTH "
জেমসটার

1
bcপসিক্সের অংশ, এটি সাধারণত প্রাক-ইনস্টল করা হয়।
ফুজ

এটি উইন্ডোজ 7 এ গিট ব্যাশ ব্যবহার করে আমার জন্য কাজ করেছে ... ধন্যবাদ :)
দ্য বিস্ট

31

আপনি -lবিকল্প দ্বারা বিসি ব্যবহার করতে পারেন (এল লেটার)

RESULT=$(echo "$IMG_WIDTH/$IMG2_WIDTH" | bc -l)

4
আমি যদি -lআমার সিস্টেমে এটি অন্তর্ভুক্ত না করি, বিসি ভাসমান পয়েন্ট গণিত করে না।
স্টারবিয়াম্রেনবোলাবস

28

সিসির বিকল্প হিসাবে, আপনি আপনার স্ক্রিপ্টের মধ্যে awk ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ:

echo "$IMG_WIDTH $IMG2_WIDTH" | awk '{printf "%.2f \n", $1/$2}'

উপরের অংশে, "% .2f" প্রিন্টফ ফাংশনকে দশমিক স্থানের পরে দুটি অঙ্ক সহ একটি ভাসমান পয়েন্ট নম্বর ফেরত দিতে বলে। আমি ভেরিয়েবলগুলিতে পাইপ টু পাইপগুলিকে ক্ষেত্র হিসাবে ব্যবহার করি যেহেতু তাদের উপর awk সঠিকভাবে পরিচালিত হয়। "$ 1" এবং "$ 2" প্রথম এবং দ্বিতীয় ক্ষেত্রকে বিশ্রী আকারে ইনপুট উল্লেখ করে।

এবং আপনি ফলাফলটি অন্য কয়েকটি পরিবর্তনশীল হিসাবে ব্যবহার করে এটি সংরক্ষণ করতে পারেন:

RESULT = `echo ...`

অসাধারণ! ধন্যবাদ। এটি এম্বেড থাকা পরিবেশের জন্য সহায়ক যেখানে বিসি উপস্থিত নেই। আপনি আমাকে কিছু ক্রস সংকলন সময় বাঁচিয়েছেন।
উত্সাহী

19

ভাসমান পয়েন্ট গণিত সহ অনেক অতিরিক্ত সুন্দর বৈশিষ্ট্য সহ zsh, একটি (প্রায়) বাশ সুপারিট চেষ্টা করার উপযুক্ত সময়। এখানে আপনার উদাহরণটি zsh এর মতো হবে:

% IMG_WIDTH=1080
% IMG2_WIDTH=640
% result=$((IMG_WIDTH*1.0/IMG2_WIDTH))
% echo $result
1.6875

এই পোস্টটি আপনাকে সাহায্য করতে পারে: বাশ - নৈমিত্তিক ব্যবহারের জন্য zsh এ স্যুইচিং?


3
আমি zsh এর একটি বিশাল ফ্যান এবং এটি গত 4 বছর ধরে ব্যবহার করছি, তবে ইন্টারেক্টিভ ব্যবহার এখানে একটি ভাল জোর। Zsh এর প্রয়োজন হয় এমন একটি স্ক্রিপ্ট সাধারণত বিভিন্ন মেশিনের বিভিন্ন সেট জুড়ে খুব বেশি বহনযোগ্য হতে পারে না কারণ দুঃখের বিষয় (সত্য বলতে গেলে, এটি ঠিক আছে; ওপি কীভাবে এটি ব্যবহার করবে তা বেশিরভাগই বলেনি)।
ব্রায়ান ক্লাইন

17

ঠিক আছে, ভাসমানটি এমন সময় ছিল যেখানে নির্দিষ্ট দশমিক যুক্তি ব্যবহৃত হত:

IMG_WIDTH=100
IMG2_WIDTH=3
RESULT=$((${IMG_WIDTH}00/$IMG2_WIDTH))
echo "${RESULT:0:-2}.${RESULT: -2}"
33.33

শেষ লাইনটি বাশিম, যদি ব্যাশ ব্যবহার না করে তবে পরিবর্তে এই কোডটি ব্যবহার করে দেখুন:

IMG_WIDTH=100
IMG2_WIDTH=3
INTEGER=$(($IMG_WIDTH/$IMG2_WIDTH))
DECIMAL=$(tail -c 3 <<< $((${IMG_WIDTH}00/$IMG2_WIDTH)))
RESULT=$INTEGER.$DECIMAL
echo $RESULT
33.33

কোডটির পিছনে যুক্তিটি হ'ল: 2 দশমিকের জন্য ভাগের আগে 100 দ্বারা গুণ করে।


5

আপনি যদি নিজের পছন্দের বৈকল্পিক খুঁজে পান তবে আপনি এটি কোনও ফাংশনেও গুটিয়ে রাখতে পারেন।

এখানে আমি একটি ডিভ ফাংশনে কিছু বাশিজম মোড়ানো করছি:

এক রৈখিক:

function div { local _d=${3:-2}; local _n=0000000000; _n=${_n:0:$_d}; local _r=$(($1$_n/$2)); _r=${_r:0:-$_d}.${_r: -$_d}; echo $_r;}

বা মাল্টি লাইন:

function div {
  local _d=${3:-2}
  local _n=0000000000
  _n=${_n:0:$_d}
  local _r=$(($1$_n/$2))
  _r=${_r:0:-$_d}.${_r: -$_d}
  echo $_r
}

এখন আপনি ফাংশন আছে

div <dividend> <divisor> [<precision=2>]

এবং এটি পছন্দ করুন

> div 1 2
.50

> div 273 123 5
2.21951

> x=$(div 22 7)
> echo $x
3.14

হালনাগাদ আমি একটি ছোট স্ক্রিপ্ট যুক্ত করেছি যা আপনাকে বাশের জন্য ভাসমান পয়েন্ট সংখ্যা সহ প্রাথমিক ক্রিয়াকলাপ সরবরাহ করে:

ব্যবহার:

> add 1.2 3.45
4.65
> sub 1000 .007
999.993
> mul 1.1 7.07
7.7770
> div 10 3
3.
> div 10 3.000
3.333

এবং এখানে স্ক্রিপ্ট:

#!/bin/bash
__op() {
        local z=00000000000000000000000000000000
        local a1=${1%.*}
        local x1=${1//./}
        local n1=$((${#x1}-${#a1}))
        local a2=${2%.*}
        local x2=${2//./}
        local n2=$((${#x2}-${#a2}))
        local n=$n1
        if (($n1 < $n2)); then
                local n=$n2
                x1=$x1${z:0:$(($n2-$n1))}
        fi
        if (($n1 > $n2)); then
                x2=$x2${z:0:$(($n1-$n2))}
        fi
        if [ "$3" == "/" ]; then
                x1=$x1${z:0:$n}
        fi
        local r=$(($x1"$3"$x2))
        local l=$((${#r}-$n))
        if [ "$3" == "*" ]; then
                l=$(($l-$n))
        fi
        echo ${r:0:$l}.${r:$l}
}
add() { __op $1 $2 + ;}
sub() { __op $1 $2 - ;}
mul() { __op $1 $2 "*" ;}
div() { __op $1 $2 / ;}

1
local _d=${3:-2}সহজ
কামিলকুক

4

এটি সত্যিই ভাসমান বিষয় নয়, তবে আপনি যদি এমন কিছু চান যা সিসির একটি অনুরোধে একাধিক ফলাফল নির্ধারণ করে ...

source /dev/stdin <<<$(bc <<< '
d='$1'*3.1415926535897932384626433832795*2
print "d=",d,"\n"
a='$1'*'$1'*3.1415926535897932384626433832795
print "a=",a,"\n"
')

echo bc radius:$1 area:$a diameter:$d

একটি বৃত্তের ক্ষেত্রফল এবং ব্যাসকে গণনা করে যার ব্যাসার্ধটি $ 1 এ দেওয়া হয়েছে


4

উইন্ডিতে এমন কিছু পরিস্থিতি রয়েছে যা আপনি বিসি বেকোস ব্যবহার করতে পারবেন না এটি ব্যস্তবক্স বা এমবেডেড সিস্টেমগুলির কিছু কাটা ডাউন সংস্করণগুলির মতো, এটি কেবল উপস্থিত নাও হতে পারে। যে কোনও ক্ষেত্রে বাহ্যিক নির্ভরতা সীমাবদ্ধ করা সর্বদা একটি ভাল কাজ তাই আপনি সর্বদা (সংখ্যার) দ্বারা বিভাজনিত সংখ্যায় শূন্য যোগ করতে পারেন, এটি 10 ​​পাওয়ার দ্বারা গুণিত করার সমান (আপনার 10 অনুসারে একটি শক্তি বেছে নেওয়া উচিত) আপনার প্রয়োজনীয় নির্ভুলতা), এটি বিভাজনকে একটি পূর্ণসংখ্যার সংখ্যা করে তুলবে। একবার আপনার সেই পূর্ণসংখ্যাটি স্ট্রিং হিসাবে বিবেচনা করে এবং দশমিক বিন্দুতে অবস্থান করুন (ডান থেকে বামে এটি সরানো) দশবারের সমান সংখ্যার সমান আপনি সংখ্যাকে গুণ করে। এটি কেবলমাত্র পূর্ণসংখ্যার সংখ্যা ব্যবহার করে ভাসমান ফলাফল পাওয়ার সহজ উপায়।


1
এমনকি ব্যাসিবক্সেও অজ রয়েছে। সম্ভবত এখানে আরও বিশিষ্ট অ্যাওক উত্তর থাকা উচিত।
ট্রিপলি

4

আপনি বাশে ফ্লোটিং পয়েন্ট বিভাগ ব্যবহার করতে পারবেন না তবে আপনি স্থির পয়েন্ট বিভাগ ব্যবহার করতে পারেন। আপনাকে যা করতে হবে তা হ'ল 10 এর পাওয়ার দ্বারা আপনার পূর্ণসংখ্যাগুলি গুণ করে এবং তারপরে পূর্ণসংখ্যার অংশটি বিভক্ত করে ভগ্নাংশের অংশ পেতে একটি মডুলো অপারেশন ব্যবহার করতে হবে। প্রয়োজন মত গোল।

#!/bin/bash

n=$1
d=$2

# because of rounding this should be 10^{i+1}
# where i is the number of decimal digits wanted
i=4
P=$((10**(i+1)))
Pn=$(($P / 10))
# here we 'fix' the decimal place, divide and round tward zero
t=$(($n * $P / $d + ($n < 0 ? -5 : 5)))
# then we print the number by dividing off the interger part and
# using the modulo operator (after removing the rounding digit) to get the factional part.
printf "%d.%0${i}d\n" $(($t / $P)) $(((t < 0 ? -t : t) / 10 % $Pn))

4

আমি জানি এটি পুরানো, তবে খুব লোভনীয়। সুতরাং, উত্তরটি হ'ল: আপনি পারবেন না ... তবে আপনি একধরণের পারেন। আসুন এটি চেষ্টা করুন:

$IMG_WIDTH=1024
$IMG2_WIDTH=2048

$RATIO="$(( IMG_WIDTH / $IMG2_WIDTH )).$(( (IMG_WIDTH * 100 / IMG2_WIDTH) % 100 ))

এর মতো আপনি পয়েন্টের পরে ২ টি অঙ্ক পাবেন, কাটা কাটা (একে একে নীচের দিকে ডাকুন, হাহা) খাঁটি বাশে (অন্যান্য প্রক্রিয়া আরম্ভ করার দরকার নেই)। অবশ্যই, যদি আপনার 10 পয়েন্টের পরে কেবল একটি ডিজিটের প্রয়োজন হয় এবং আপনি 10 টি গুণ করেন।

এটি কি করে:

  • প্রথম $ ((...)) পূর্ণসংখ্যা বিভাগ করে;
  • দ্বিতীয় $ ((...)) ১০০ গুণ বড় কিছুতে পূর্ণসংখ্যা বিভাগ করে, মূলত আপনার 2 ডিজিটটি পয়েন্টের বাম দিকে সরিয়ে দেয়, তারপরে (%) আপনাকে মোডুলো করে কেবল সেই 2 ডিজিটটি পাবে।

বোনাস ট্র্যাক : বিসি সংস্করণ x 1000 আমার ল্যাপটপে 1,8 সেকেন্ড সময় নিয়েছে, যখন খাঁটি বাশ এক 0,016 সেকেন্ড নিয়েছিল।


3

বাশে কীভাবে ভাসমান পয়েন্ট গণনা করবেন:

কমান্ডটি দিয়ে " এখানে স্ট্রিংস " ( <<<) ব্যবহার bcনা করে সর্বাধিক উত্সাহিত উদাহরণগুলির মতো , এখানে আমার প্রিয় bcভাসমান পয়েন্ট উদাহরণটি ঠিক মেন পৃষ্ঠাগুলির EXAMPLESবিভাগ থেকে bcদেখুন (দেখুন)man bc ম্যানুয়াল পৃষ্ঠাগুলি দেখুন)।

শুরু করার আগে জানতে পাই জন্য একটি সমীকরণ হয় যে: pi = 4*atan(1)a()নীচে জন্য bcগণিত ফাংশন atan()

  1. এই একটি পরিবর্তনশীল নামক এই ক্ষেত্রে - কিভাবে ব্যাশ পরিবর্তনশীল মধ্যে একটি ফ্লোটিং পয়েন্ট গণনা ফলাফল সঞ্চয় করতেpi । নোট করুন যে scale=10এক্ষেত্রে নির্ভুলতার দশমিক অঙ্কের সংখ্যা সেট করে 10। এই স্থানের পরে কোনও দশমিক অঙ্ক ছাঁটা হয়েছে

    pi=$(echo "scale=10; 4*a(1)" | bc -l)
  2. এখন কোডের একটি একক লাইন রয়েছে যা এই ভেরিয়েবলের মানটিও প্রিন্ট করে, কেবল echoকমান্ডটি অনুসরণ করে অনুসরণ-অনুসারে কমান্ডটি অনুসরণ করুন follows আদেশ অনুসারে দশ দশমিক জায়গায় কাটা নোট করুন :

    pi=$(echo "scale=10; 4*a(1)" | bc -l); echo $pi
    3.1415926532
  3. অবশেষে, কিছু বৃত্তাকার মধ্যে নিক্ষেপ করা যাক। এখানে আমরা printf4 দশমিক স্থানে ফাংশনটি ব্যবহার করব । নোট করুন 3.14159...এখন রাউন্ড 3.1416। যেহেতু আমরা গোল করছি, সুতরাং আমাদের আর scale=10দশমিক দশকে ছাঁটাই করতে ব্যবহার করার দরকার নেই , সুতরাং আমরা কেবল সেই অংশটি সরিয়ে ফেলব। এখানে শেষ সমাধানটি:

    pi=$(printf %.4f $(echo "4*a(1)" | bc -l)); echo $pi
    3.1416

এখানে উপরোক্ত কৌশলগুলির জন্য আরও একটি দুর্দান্ত অ্যাপ্লিকেশন এবং ডেমো রয়েছে: রান-টাইম পরিমাপ এবং মুদ্রণ।

নোট যা dt_minথেকে গোল হয়ে 0.01666666666...যায় 0.017:

start=$SECONDS; sleep 1; end=$SECONDS; dt_sec=$(( end - start )); dt_min=$(printf %.3f $(echo "$dt_sec/60" | bc -l)); echo "dt_sec = $dt_sec; dt_min = $dt_min"
dt_sec = 1; dt_min = 0.017

সম্পর্কিত:


1
বিস্তারিত উদাহরণ সহ শক্ত উত্তর এবং কেস এবং
গোলগুলি প্রিন্টফ


2

যারা গ্রহণযোগ্য উত্তরের সাথে শতাংশ গণনা করার চেষ্টা করছেন, তবে তারা নির্ভুলতা হারাচ্ছেন:

আপনি যদি এটি চালান:

echo "scale=2; (100/180) * 180" | bc

আপনি 99.00কেবল পান, যা নির্ভুলতা হারাচ্ছে।

আপনি যদি এভাবে চালান:

echo "result = (100/180) * 180; scale=2; result / 1" | bc -l

এখন আপনি পাবেন 99.99

কারণ আপনি কেবল মুদ্রণের মুহুর্তেই স্কেলিং করছেন।

পড়ুন এখানে


1

** ব্যাশ / শেল ইনজেকশন-নিরাপদ ভাসমান পয়েন্ট গণিত **

দ্রষ্টব্য: এই উত্তরের কেন্দ্রবিন্দু হ'ল বাশ (বা অন্যান্য শেলস) এ গণিত সম্পাদনের জন্য ইনজেকশন-নিরাপদ সমাধানের জন্য ধারণা সরবরাহ করা। অবশ্যই, উন্নত স্ট্রিং প্রসেসিং ইত্যাদি সম্পাদনের ক্ষেত্রে সামান্য সমন্বয় সহ একই ব্যবহার করা যেতে পারে

যে সমাধানগুলি উপস্থাপিত হয়েছিল, সেগুলির বেশিরভাগটি বাহ্যিক ডেটা (ভেরিয়েবল, ফাইল, কমান্ড লাইন, পরিবেশের ভেরিয়েবল) ব্যবহার করে ফ্লাইতে ছোট স্ক্রিপ্টলেট তৈরি করে। বাহ্যিক ইনপুটটি ইঞ্জিনে দূষিত কোড ইনজেকশনের জন্য ব্যবহার করা যেতে পারে, তাদের মধ্যে অনেকগুলি

নীচে বেসিক গণিত গণনা সম্পাদনের জন্য বিভিন্ন ভাষা ব্যবহারের সাথে তুলনা করা হয়েছে, যেখানে ভাসমান পয়েন্টের ফলাফল। এটি A + B * 0.1 (ভাসমান পয়েন্ট হিসাবে) গণনা করে।

সমস্ত সমাধানের প্রচেষ্টা গতিশীল স্ক্রিপ্টলেটগুলি এড়াতে এড়িয়ে যায়, যা বজায় রাখা অত্যন্ত কঠিন, পরিবর্তে তারা স্থির প্রোগ্রাম ব্যবহার করে এবং নির্দিষ্ট পরামিতিগুলিতে পরামিতিগুলি পাস করে। কোডগুলি ইনজেকশনের সম্ভাবনা হ্রাস করে - তারা নিরাপদে বিশেষ অক্ষরের সাথে পরামিতিগুলি পরিচালনা করবে। ব্যতিক্রমটি 'বিসি' যা ইনপুট / আউটপুট সুবিধা সরবরাহ করে না

ব্যতিক্রমটি 'বিসি', যা কোনও ইনপুট / আউটপুট সরবরাহ করে না, সমস্ত ডেটা স্টিডিনে প্রোগ্রামের মাধ্যমে আসে এবং সমস্ত আউটপুট স্টাডআউটে যায়। সমস্ত গণনা একটি স্যান্ডবক্সে কার্যকর করা হচ্ছে, যা পার্শ্ব প্রতিক্রিয়া (ফাইল খোলার ইত্যাদি) অনুমতি দেয় না। তত্ত্ব অনুসারে, ডিজাইনের মাধ্যমে ইঞ্জেকশন নিরাপদ!

A=5.2
B=4.3

# Awk: Map variable into awk
# Exit 0 (or just exit) for success, non-zero for error.
#
awk -v A="$A" -v B="$B" 'BEGIN { print A + B * 0.1 ; exit 0}'

# Perl
perl -e '($A,$B) = @ARGV ; print $A + $B * 0.1' "$A" "$B"

# Python 2
python -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print a+b*0.1' "$A" "$B"

# Python 3
python3 -c 'import sys ; a = float(sys.argv[1]) ; b = float(sys.argv[2]) ; print(a+b*0.1)' "$A" "$B"

# BC
bc <<< "scale=1 ; $A + $B * 0.1"

অযৌক্তিক যুক্তি সহ অজগর 3 এর জন্য: python3 -c 'import sys ; *a, = map(float, sys.argv[1:]) ; print(a[0] + a[1]*0.1 + a[2])' "$A" "$B""4200.0" ==> 4205.63
ওয়্যারিংহারনেস

0

এখানে awk কমান্ডটি রয়েছে: -F = ক্ষেত্র বিভাজক == +

echo "2.1+3.1" |  awk -F "+" '{print ($1+$2)}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.