Ошибка округления awk при использовании int() в сочетании с log()

См. ниже:

read -p "Enter keyword: " keyword

if search=$(grep "$keyword"./records)
        then
                echo "$search"
        else
                echo "$keyword not found!"
        fi
  1. Не используйте цитирование с $(), как было указано выше @jasonwryan
  2. Нет необходимости использовать трубопровод catс grep.Используйте grep <pattern> fileвместо
  3. Удалить ;;послеfi
0
10.10.2019, 23:15
1 ответ

Округление никогда не бывает легким и не может быть точным , однако до 15 цифр (для 53-битной мантиссы )аппроксимация (округление )должно происходить в сторону правильный номер.

$ printf '%s\n' 999 1000 1001 | awk '{ v=log($1) / log(10); printf("%.15g\n",v) }'
2.99956548822598
3
3.00043407747932

Таким образом, округление до ближайшего целого числа (в сторону нуля, а также с учетом отрицательных чисел )с помощью %iдаст нужное целое число:

$ printf '%s\n' 999 1000 1001 | 
    awk '{ 
           v=log($1) / log(10); 
           result=sprintf("%.15g",v); 
           printf("%-15s %i\n",v, result)
         }
        '
2.99957         2
3               3
3.00043         3

Это должно работать правильно до 14-значных чисел (не пытайтесь расширяться дальше с 53-битной мантиссой по умолчанию awk, в некоторых случаях это не удастся ).

0
28.01.2020, 03:11

Теги

Похожие вопросы