LinuxForum.Fans
Тема

умножение в bash с плавающей запятой.

Автор: moshell 32 сообщений 12497 просмотров
#345548
Vitri написал:

оно прямо из окружения bash работает?
то есть не надо погружаться в иной мир как например с mc

// я не верно выразился.
мне нужно чтобы был вывод результата в std, чтоб его можно было использовать и загонять в переменную

#345561
"moshell" написал:
я так и не понял. где калькулятор для консоли?

тот же bc, но с большой осторожностью или любой скриптовый язык (перлопитонорубилисп).

с bc лучше вычислять с заранее превосходящей точностью (ключом -l, например), а потом форматировать printf'ом:

text

LC_NUMERIC=C printf "%.3f" "$(echo "100/9*100" | bc -l)"

громоздко, некрасиво, но работать будет...

#345575

Для bc с ключом "-l" надо задать ещё scale, это удобно сделать в ~/.bcrc

text

/* this is a options file for bc (man 1 bc)
   this file executed via BC_ENV_ARGS=~/.bcrc environment variable */
scale=10

а где-то надо установить эту BC_ENV_ARGS в $HOME/.bcrc:
в .bahsrc, .tcshrc или в скрипте, выполняющемся при входе в систему,
через какой-нибудь ~/.config/autostart/*.desktop.

Пётр.

#345585

moshell,

It can accept a command line argument, in which case it executes that single command and exits.
#345596

спасибо большое!

#346942
"Fat-Zer" написал:
только то что написано: использование bc в скриптах без осмотрительности даёт большое количество ошибок...
питон от дурости не помогает. Всегда ваш, К.О.
"Fat-Zer" написал:
как и везде, в том, что два последних разряда не правильные...

а почему два последних разряда должны быть "правильными"? Это не баг, а фича. Причём не только bc, а _любого_ калькулятора. В т.ч. и питоньего.

"Fat-Zer" написал:
дык, в этом и идея, что если FP нужны, то на bash'е лучше не писать...

дык в bash'е и нет никаких FP, есть калькулятор: bc.

"Fat-Zer" написал:
ничего не понял...

тогда вам просто надо запомнить правило: нельзя сравнивать на равенство два FP числа. И "последние разряды" тоже не надо, не заглядывайте коту под хвост.

"Fat-Zer" написал:
при выводе дробные числа как-то принято округлять...

ну вот и округляйте. ПРИ ВЫВОДЕ.

"moshell" написал:
простая задача сводится на нет. тупо умножить "плавающую" цифру на не плавающую неужели это сложно в bash. (ответ - в bash ДА!)

в bash это тупо невозможно. Там просто нет таких чисел. Только самому костылять кривой и медленный велосипед. Но есть bc.

"moshell" написал:
то есть не надо погружаться в иной мир

надо. Bc это не просто калькулятор, а программируемый калькулятор. Впрочем, 2*2 он тоже умеет.

"moshell" написал:
мне нужно чтобы был вывод результата в std, чтоб его можно было использовать и загонять в переменную
что-бы был вывод в std, нужно что-бы был ввод в std. Очевидно жеж!

"Fat-Zer" написал:
тот же bc, но с большой осторожностью или любой скриптовый язык (перлопитонорубилисп).

facepalm...

"Fat-Zer" написал:
громоздко, некрасиво, но работать будет...

вот вам faq http://phodd.net/gnu-bc/bcfaq.html
А вот код того, без чего вы так безмерно страдаете:

Remove trailing zeroes in GNU bc

When performing some - usually division-related - calculations in bc, especially with the scale variable set high, the answer returned to the console (or stored in a variable) has many trailing zeroes at the end. e.g. the code scale=20;7/4 will cause 1.75000000000000000000 to be printed as the result.

Often this is cumbersome and makes 'obvious' numbers harder to read. The solution is the following function:
text
   define trunc(x){auto os;os=scale;for(scale=0;scale<=os;scale++)if(x==x/1){x/=1;scale=os;return x}} 

With this function you can say things like scale=20;q=7/4;q=trunc(q);q or simply scale=20;trunc(7/4), both of which will print 1.75 as expected.

An improved version of this, which can also deal with trailing 9's (in decimal) can be found in output_formatting.bc, and this also contains many other output formatting functions, including two similar to C's printf().

#350344
"drBatty" написал:
тогда вам просто надо запомнить правило: нельзя сравнивать на равенство два FP числа. И "последние разряды" тоже не надо, не заглядывайте коту под хвост.

казалось бы, при чём тут это....

"drBatty" написал:
А вот код того, без чего вы так безмерно страдаете:

для того что бы пару раз использовать bc в скрипте больно толсто...

"drBatty" написал:
дык в bash'е и нет никаких FP, есть калькулятор: bc.

дык, в этом и идея, что если FP нужны, то на bash'е лучше не писать...

дискуссия как-то зациклилась...

#350395

чем awk не канает - типа точностью ?

а так то на том на чем пайтон написан то же по ссути нет никакого умножения ни с плавающей ни с фиксированой.

#360655
"Fat-Zer" написал:
казалось бы, при чём тут это....
при том.

"Fat-Zer" написал:
для того что бы пару раз использовать bc в скрипте больно толсто...
это что-бы "сделать красиво" в выводе.

"Fat-Zer" написал:
дык, в этом и идея, что если FP нужны, то на bash'е лучше не писать...

если вам надо считать, вам нужен калькулятор. Не понимаю, при чём тут вообще питон?

#360662
text
gu@moshell:~$ perl -e 'print 10.2 * 0.3, "\n"'
3.06
gu@moshell:~$ perl -e 'print "barney" x 4, "\n"'
barneybarneybarneybarney
gu@moshell:~$ perl -e 'print "12fred34" * (2+1), "\n"'
36
gu@moshell:~$ perl -e 'print "barney" * 4, "\n"'
0
gu@moshell:~$ perl -e 'print 20 x 4, "\n"'
20202020
gu@moshell:~$

без лишних напрягов

#360674
"moshell" написал:
без лишних напрягов

всё равно сишечка лучше, быстрее, и няшнее.

#360686

Доктор, у вас професси(а|о)нальная болезнь.
Вы во всем видите патологию

Войдите или зарегистрируйтесь, чтобы ответить.