2014-09-04 2 views
0

Я пробовал много разных способов оценить беспорядок внизу как поплавок. Я думаю, что я почти там с использованием bc, но он все еще не оценивает.Вопрос расчета поплавка Bash

s=$((($s+((${flowx[$(($a+1))]}-(${flowx[$a]}))*(${flowy[$(($a+1))]}+${flowy[$a]}))/2) | bc)) 

Любой вход?

+2

BashFAQ # 22 - ваш друг - http://mywiki.wooledge.org/BashFAQ/022 - но он говорит вам использовать только 'bc', который ... ну, да. Используйте 'bc', не используйте' $ (()) '. Поскольку вы уже знаете, что 'bc' существует и что он может делать математику с плавающей запятой, как это вопрос? –

+0

Можете ли вы привести пример чисел, которые вы используете через эту вещь? Что вы пытаетесь достичь в любом случае? – lxg

+0

Вы рассматривали использование awk/perl/python/ruby? – dawg

ответ

1

Вы можете избежать всех цитат и такие вещи, если вы вместо hereline (как @CharlesDuffy в противном случае большого ответа рекомендует) будете использовать heredoc как как:

flowx=(0.124852 -0.0156593 -0.0932662 -0.0464323 0.0305706 0.00833429 0.0245359 0.0292034 -0.0564935) 
flowy=(0.197532 0.120311 0.0864692 -0.0071995 0.097294 0.0624036 0.0825287 0 0.0340206) 
a=1 
s=0.1 

res=$(bc -l <<EOF 
$s + ((${flowx[a+1]} - ${flowx[a]}) * (${flowy[a+1]} + ${flowy[a]}))/2 
EOF 
) 
echo "$res" 

отпечатки

.09197621484831000000 
+0

Это сработало! Спасибо, ребята, за вашу помощь. Я относительно новичок в этом, поэтому я извинился за недостаток информации. Спасибо за ваше терпение! –

3

Не использовать $(()).

Например, принимая соответствующую часть вашего расчета:

s=$(bc <<<"$s + ((${flowx[a+1]} - ${flowx[a]}) * (${flowy[a+1]} + ${flowy[a]}))/2") 

до тех пор, как flowx и flowy являются стандартные целочисленные индексированные массивы, а не ассоциативные массивы, вам даже не нужно использовать $(()) при индексации в них (или $ операторов внутри этих индексов), поскольку индекс неассоциативного массива в bash по умолчанию является математическим контекстом.

Или, более читаемо, чем все эти вложенности скобок, используйте dc (здесь, сконфигурированный с 10 цифр точности):

s=$(dc <<EOF 
10 k 
${flowx[a+1]} 
${flowx[a]} 
- 
${flowy[a+1]} 
${flowy[a]} 
+ 
* 
$s + 
2/
p 
EOF 
) 

See? Много более читаемый.

+0

Мои массивы стандартно индексируются по целому числу. Используя то, что вы написали, он дал мне эту ошибку: (standard_in) 1: ошибка синтаксиса Вы знаете, от чего это может быть? –

+0

Во-первых, '<<<' - это багизм - если вы используете '/ bin/sh', а не bash, там есть вероятность ошибки. Помимо этого, измените 'bc <<<' на 'echo' и проверите вручную расширение - это вне манжеты, а не что-то, что можно было протестировать, так как вы не предоставили образцы своих массивов, значения & c. достаточный для проверки любого предлагаемого решения. –

+0

@CharlesDuffy меняет 'flowax' на' flowx' в строке 'bc' ...;) – jm666

0

Если ksh93 установлен в вашей системе, я предлагаю вам использовать его вместо bash для этой задачи. Он имеет встроенную поддержку 64-битной плавающей точки IEEE.

Смежные вопросы