арифметика с плавающей точкой с функциями - PullRequest
0 голосов
/ 28 апреля 2018

Что делают эти функции, так это то, что они скручивают json-файл и анализируют его, вывод которого - число.

function func() {
curl -Ss -H 'Cache-Control: no-cache' url.com/A?limit=2 | jq -r '. 
[] | .[] | .blah'
}
function func2() {
curl -Ss -H 'Cache-Control: no-cache' url.com/B2?limit=2 | jq -r '. 
[] | .[] | .blah'
}
function func3() {
curl -Ss -H 'Cache-Control: no-cache' url.com/C3?limit=2 | jq -r '. 
[] | .[] | .blah'
} 

function example() { 
"(($(func) * $(func2) * $(func3)))" | bc -l
}
#result is it echoing the numbers, but not actually doing the math.
#echoing .072*.027 in bc, but no math.

Так что я пытаюсь сделать арифметику с плавающей запятой через bash, на это будет ссылаться через другую функцию. Разница лишь в том, что это с функциями. Bash не поддерживает арифметику с плавающей запятой, которая решается с помощью bc.

Пример Функция числовой вывод:

#func output
0.072854 #A
0.072855 #B
0.072828 #C
0.072827 #D

#func2 output
0.027873 #A
0.027884 #B
0.027848 #C
0.027847 #D

#func3 output
0.383170 #A
0.383215 #B
0.381858 #C
0.381857 #D

Как это работает, A * A * A = output1, B * B * B = output2, C * C * C = ouput3

Что я пробовал:

function blah() {
echo $((func*func2*func3)) | bc -l
}
#result is "0"

echo "$(func) * $(func2) * $(func3)" | bc -l
#result is:
.072965
.072966
.072925
.002030350008
.027856
.027827
.010633768950
.382371
.380995
.380977

1 Ответ

0 голосов
/ 28 апреля 2018

Полагаю, вы захотите, чтобы ваша функция была такой:

echo "$(func) * $(func2) * $(func3)" | bc -l

РЕДАКТИРОВАТЬ : Поскольку у вас есть несколько значений, которые можно вывести, вы можете поместить их в массивы, затем выполнить цикл по ним и умножить значения:

example() {
  a=($(func1))
  b=($(func2))
  c=($(func3))

  for i in {0..3} # set to number of values returned
    do 
      echo "${a[i]} * ${b[i]} * ${c[i]}" | bc -l
    done
}

Исходя из ваших значений, вывод должен быть:

.000778087816708140
.000778496988156300
.000774451610799552
.000774411139231933

Если ваш func возвращает значение, тогда достаточно использовать echo с bc.

...