Операция с плавающей точкой с bc?

42

Похоже, что bc не поддерживает операции с плавающей точкой, когда я делаю echo 1/8 | bcэто, получаю ноль.

Я проверил bc (1), но он даже не упоминает float, так что мне интересно, если это поддерживается?

маргаритка
источник
9
echo "scale=4; 1/8" | bc
LiuYan 研 研
Этот вопрос и, в частности, принятый ответ могут быть вам интересны.
Эмануэль Берг

Ответы:

56

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

[...] масштаб по умолчанию - 20

scaleявляется одной из ряда «специальных переменных», упомянутых на странице руководства. Вы можете установить его:

scale=4

В любое время вы хотите ( -lбыл ли использован или нет). Это относится к числу значащих цифр, используемых в десятичной дроби . Другими словами, последующие решения будут округлены до этого количества цифр после десятичной шкалы (== с фиксированной точностью).

Масштаб по умолчанию sans -lравен 0, что означает округление до целых чисел.

лютик золотистый
источник
27

Страница man говорит:

Если bc вызывается с опцией -l, предварительно загружается математическая библиотека [...]

Понимание этого может быть улучшено, действительно ...

Хауке Лагинг
источник
14
Сообщить об этом как об ошибке ...
vonbrand
0

1) Числа в bc имеют шкалу. Масштаб числа не следует путать с масштабным коэффициентом. Тот же самый «масштаб» используется в качестве функции для запроса масштаба числа или в качестве параметра для установки коэффициента масштабирования.

echo "scale=scale(1.1);11/10" | bc will return 1.1

2) Коэффициент масштабирования определяет, сколько цифр хранится справа от десятичной точки при выполнении операций. Если s - текущий масштабный коэффициент, sa - масштаб первого операнда a, sb - масштаб второго операнда b, результаты усекаются следующим образом:

    scale of result
a+b     max(sa,sb)
a-b     max(sa,sb)
a*b     min(sa+sb , max(s,sa,sb))
a/b     s
a%b     so that a = b*quotient + remainder; remainder has sign of a
a^b     min(sa×|b|, max(s,sa)); b must be integer
sqrt(a) max(s,sa)

3) В начале координат был препроцессор DC. Сейчас во многих системах bc - это отдельная программа.

Источник: [ https://plan9.io/magic/man2html/1/dc]

CD9
источник