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

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

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

xBeginner
Сообщения: 9

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

Сообщение xBeginner » 09.03.2018 07:35

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

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

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

-нормально 1023

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

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

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

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

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

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

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

Спасибо
под-пись
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14113
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 09.03.2018 10:21

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

xBeginner
Сообщения: 9

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

Сообщение xBeginner » 09.03.2018 21:21

Не объясняет.
под-пись
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7135
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 10.03.2018 02:21

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

xBeginner
Сообщения: 9

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

Сообщение xBeginner » 10.03.2018 02:37

Спасибо, но всё равно плохо понимаю. У меня получается в интервале [0.00..1000.00] с шагом .01 умножение на 100 даёт для 11% случаев видимую погрешность. При этом тоже но в AWK работает "точно".
под-пись
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7135
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 11.03.2018 00:17

Scio me nihil scire.
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 14113
Статус: grammatikführer
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick » 11.03.2018 11:16

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

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

% 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 » 12.03.2018 02:21

Спасибо. А в jq есть округление? floor нашёл в man, а округление не вижу. Много букаф, может пропускаю :)
под-пись
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7135
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 13.03.2018 01:41

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

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

Что-то типа floor(10.22 * 100 * N) / N, где N - нужная точность после запятой (100, 1000 и т.д.)
Scio me nihil scire.
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7135
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

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

Сообщение serzh-z » 13.03.2018 01:47

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

xBeginner
Сообщения: 9

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

Сообщение xBeginner » 13.03.2018 02:03

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

Вернуться в «Программы»