Вычисления в jq

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

Ответить
xBeginner
Сообщения: 9

Вычисления в jq

Сообщение xBeginner »

Наткнулся на "подлянку"

Код: Выделить всё

# jq '10.23*100' <<EOF
{}
EOF

-нормально 1023

Код: Выделить всё

# jq '10.22*100' <<EOF
{}
EOF

возвращает 1022.0000000000001
Я понимаю, десятичные дроби не переводятся в двоичную систему, но

Код: Выделить всё

# jq '100.22*100' <<EOF
{}
EOF

-опять нормально 10022

Что за фишка или баг?

Спасибо
под-пись
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вычисления в jq

Сообщение Bizdelnick »

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
xBeginner
Сообщения: 9

Re: Вычисления в jq

Сообщение xBeginner »

Не объясняет.
под-пись
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Вычисления в jq

Сообщение serzh-z »

xBeginner
Особенность хранения в памяти вещественных чисел (в соответствии с указанным стандартом). 10.23 хранится в памяти как 10.229999542236328125, 10.22 - как 10.22000026702880859375, а 100.22 - как 100.220001220703125.
Спасибо сказали:
xBeginner
Сообщения: 9

Re: Вычисления в jq

Сообщение xBeginner »

Спасибо, но всё равно плохо понимаю. У меня получается в интервале [0.00..1000.00] с шагом .01 умножение на 100 даёт для 11% случаев видимую погрешность. При этом тоже но в AWK работает "точно".
под-пись
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Вычисления в jq

Сообщение serzh-z »

Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Вычисления в jq

Сообщение Bizdelnick »

xBeginner писал(а):
10.03.2018 02:37
При этом тоже но в AWK работает "точно".

Это он не работает "точно", а отбрасывает "лишние" цифры.

Shell

% awk 'BEGIN{ print 0.9999999 }' 1 % awk 'BEGIN{ print 1.000001 }' 1 % awk 'BEGIN{ printf "%.13f\n", 10.22*100 }' 1022.0000000000001 %


https://www.gnu.org/software/gawk/manual/ht...mputations.html
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
xBeginner
Сообщения: 9

Re: Вычисления в jq

Сообщение xBeginner »

Спасибо. А в jq есть округление? floor нашёл в man, а округление не вижу. Много букаф, может пропускаю :)
под-пись
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Вычисления в jq

Сообщение serzh-z »

xBeginner
Ну можно и floor использовать:

1. Превратить в целое
2. Отрезать дроби
3. Превратить в дробь

Что-то типа floor(10.22 * 100 * N) / N, где N - нужная точность после запятой (100, 1000 и т.д.)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Вычисления в jq

Сообщение serzh-z »

P.S.: в версии 1.3 ничего из этого недоступно, ни include, с помощью которого можно было свой модуль добавить, ни floor. В 1.5, судя по всему, можно свой модуль добавить и написать в нем функцию, которая будет делать toFixed или toPrecision.
Спасибо сказали:
xBeginner
Сообщения: 9

Re: Вычисления в jq

Сообщение xBeginner »

Спасибо, но это сложно для меня. Практический вопрос решил шеллом.
под-пись
Спасибо сказали:
Ответить