BC - автоматическое умножение с полной точностью

10

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

Есть ли быстрый способ отключить это или автоматически установить масштаб каждого умножения на сумму масштабов факторов, чтобы он не терял никакой точности?

Если у вас есть более элегантное решение, включающее что-то другое bc, я был бы признателен, если бы вы поделились им

Пример:

$ bc <<< '1.5 * 1.5'
2.2

Реальный ответ - 2,25.

PSkocik
источник
Тесно связано с операцией Float с bc? ,
Манатворк

Ответы:

12

Вы можете контролировать масштаб, который bcвыводится с scale=<#>аргументом.

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

Используя ваш пример:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

Вы также можете использовать -lпереключатель (благодаря @manatwork), который инициализирует масштаб до 20 вместо значения по умолчанию 0. Например:

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

Вы можете прочитать больше о scaleна bcстранице руководства .

SLM
источник
5
Или короче bc -l. « -L (буква ell.) Определите математические функции и инициализируйте масштаб до 20 вместо нуля по умолчанию» - bcспецификация
manatwork
@ Manatwork - спасибо, не заметил этого переключателя.
SLM
Спасибо. Я думаю, я мог бы установить масштаб 2147483647 (который, как оказалось, равен INT_MAX), который bc говорит мне, это максимальное значение шкалы, которое я могу установить (я так далеко в моих тестах), но я думаю, я Я протестирую его только с целыми числами и покажу bc преимущества в производительности, которые дает использование чисел с динамической длиной.
PSkocik
1
Для умножения до н.э. масштаб результата - это именно то, min(max(sx,sy,scale),sx+sy)где sxи syнаходятся масштабы xи yв x*y. Настройка scale=scale(x)+scale(y)даст максимальную необходимую точность. Установка масштаба на большее число (например, 1000) не приведет к увеличению масштаба результата. Переменная масштаба влияет только на s, и результат деления scale=1000; a/1создаст результат с 1000 десятичными цифрами (после точки) независимо от того, какой масштаб был раньше.
Исаак
1

Попробуй это :

$ bc
scale=10
1.5 * 1.5
2.25

Поиск человека до н.э. для переменной масштаба

DavAlPi
источник
0

Я создал эту функцию bash, которая не будет отображать конечные нули

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

Пример: calc 1.25^3= 1.953125

Вартан
источник