Как взять поплавок в степень другого числа с плавающей запятой? - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь выяснить, как вычислить математическое выражение, включающее скобки и показатели в bash. Не стесняйтесь предлагать решения с использованием sed, awk, perl, bash

например

 i=0.0545
 j=360
 (1+ $i * 2.43 / 100.0) ^ ($j/940) -1

Как бы вы закодировали в bash и получили бы результат с плавающей запятой?

Ответы [ 4 ]

2 голосов
/ 04 июля 2018

Для расчета x ^ n используйте:

bc -l <<< "e($n*l($x))"

или

echo "e($n*l($x))" | bc -l

Теория

Команда bc не имеет отношения к возведению в степень с использованием показателей с плавающей запятой. Однако он имеет экспоненциальную e() и логарифмическую l() функции. Используя эти две функции, мы можем вычислить возведение в степень по свойству x ^ n = exp (log (x ^ n)) = exp (n * log (x)) .

1 голос
/ 20 октября 2011

Вот оно в perl:

$ x=`perl -e 'print (1 + $ARGV[0] * 2.43 / 100.) ** ($ARGV[1] / 940.0) - 1' 0.0545 360.0`
$ echo $x
1.00132435
1 голос
/ 20 октября 2011

(Возможно, вы захотите отредактировать свой пост, включив в него то, что вы ожидаете, как правильный ответ для вашего выражения; -)

Использовать awk.Требуется подсказка, что вы ожидаете вычислений с плавающей запятой, поэтому измените любые части выражения целого числа, чтобы включить конечный .0 (как показано ниже).

i=0.0545  j=360 
awk 'BEGIN {     
  print "i=" '$i' "\tj=" '$j' "\texpr="(1.0+ '$i' * 2.43 / 100.0) ^ ('$j'/940.0) -1.0
}' /dev/null
# output 
i=0.0545        j=360   expr=0.000506991

Еще лучше, измените BEGIN на END и используйте awkНазначение var строки cmd, то есть

awk 'END{
   print "i=" i "\tj=" j "\texpr="(1.0+ i * 2.43 / 100.0) ^ (j/940.0) -1.0
}' i=0.0545  j=360 /dev/null
#output    
i=0.0545        j=360   expr=0.000506991

(я недавно читал, что BEGIN не будет обрабатывать назначения в строке cmd, но он работает с END (очевидно)).

Надеюсь, это поможет.

1 голос
/ 20 октября 2011

Я использую bc для математики, когда мне нужна точность (но в этом случае не работает, так как она не поддерживает дробный показатель):

echo "scale = 10; 1 / 3" | bc

Проще всего пойти с awk:

$ echo "" | awk 'END {print (1+ 2.43/100.0) ^ (360/940) - 1}'
0.00923751

Если вы так много не знаете, вам может понадобиться:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...