вычисление bc с большим числом с плавающей запятой

У меня есть большое число, и я хочу сделать расчет до н.э. Пример:

T_Mab = 6.00899e+09

и я хочу напечатать это так:

echo 'T_Mab =   '${T_Mab}' [s] = '${T_Mab}/31557600' [year]' | bc -l

Это дает мне "синтаксическую ошибку". Итак, как я могу это сделать?


person Patrícia Buzzatto Siqueira    schedule 22.11.2018    source источник
comment
Пример выглядит неполным - ${T_Mab_y} undefined. Вы должны быть в состоянии упростить его намного больше! Например. bc -l <<<"6.00899e+09" (что дает мне синтаксическую ошибку - я не думаю, что bc читает нотацию e).   -  person Toby Speight    schedule 22.11.2018
comment
Вы установили его так, как показано, с пробелами вокруг =? Не может быть.   -  person Benjamin W.    schedule 22.11.2018
comment
Кроме того, попробуйте свою команду в интерактивном сеансе bc. Имена переменных не могут содержать символы верхнего регистра   -  person Benjamin W.    schedule 22.11.2018
comment
И в-третьих, это просто присвоит ваш результат переменной bc, которая после этого сразу же исчезнет. Возможно, вы имели в виду что-то вроде T_Mab=$(echo '...' | bc -l)?   -  person Benjamin W.    schedule 22.11.2018
comment
Ваше выражение читается как something = something = something, почему два знака равенства?   -  person Benjamin W.    schedule 22.11.2018
comment
Возможный дубликат Как получить bc для обрабатывать числа в экспоненциальном представлении?   -  person Toby Speight    schedule 22.11.2018


Ответы (2)


Вы не можете просто написать все, что хотите отобразить, и сбросить их в bc. Другая проблема заключается в том, что bc не принимает научных обозначений. Проверьте [Как получить bc для обрабатывать числа в экспоненциальной (экспоненциальной) записи? подробнее.

Предполагая, что число уже преобразовано в правильную форму, как в ответах на связанный вопрос, вы можете записать его так в bash.

T_Mab=6008990000
echo "${T_Mab} [s] = $(bc -l <<< ${T_Mab}/31557600) [year]"

Здесь-строки добавляются с bash 3.0, если вы используете более старую версию, просто используйте $(echo ${T_Mab}/31557600|bc -l).

С учетом всего сказанного вам действительно следует рассмотреть альтернативы bc, предложенные во втором ответе на связанный вопрос, если вам не нужна произвольная точность.

person Weijun Zhou    schedule 22.11.2018
comment
Возможно, мне нужно было полностью написать свой скрипт... Проблема в том, что у меня есть файл с 10 столбцами, первый из которых - это время в секундах в той же нотации, что и число, которое я использовал в качестве примера. Второй столбец — идентификатор. Поэтому мне нужно найти среднее время от определенного идентификатора - person Patrícia Buzzatto Siqueira; 22.11.2018
comment
Вам нужно поместить всю эту информацию вместе с образцом ввода, текущим сценарием, который вы используете, а также ожидаемым результатом в свой вопрос, чтобы уточнить, чего вы пытаетесь достичь. Не оставляйте их в комментариях. - person Weijun Zhou; 22.11.2018

Синтаксическая ошибка связана с тем, что bc не читает нотацию "e" и может быть воспроизведена на очень упрощенном примере:

$ bc -l <<<"6.00899e+09"
(standard_in) 1: syntax error

Нам нужно перейти на синтаксис, который он понимает; мы можем сделать это в Bash:

v=6.00899e+09
v=${v/e/*10^}    # 6.00899*10^+09
v=${v/^+/^}      # 6.00899*10^09
bc -l <<<"($v)"
6008990000.00000

Или просто отмыть через инструмент, который понимает нотации:

printf '%f\n' "$v" | bc -l
person Toby Speight    schedule 22.11.2018