Сравнение операций с плавающей запятой в оболочке

Вы не можете скрыть что-либо от root , если только вы не используете шифрование, и даже тогда root все равно может это удалить!

Извините! ¯\ _(ツ )_/¯

0
16.03.2021, 13:03
3 ответа

Утилита bcне понимает 6.65E+07как нужное вам число.

В OpenBSD Eздесь шестнадцатеричное число, поэтому 6.65Eравно 6,664 (6,65 + 0,014 ), а затем +07добавит к этому 7, что даст 13,664, а это явно меньше, чем 50.960. В системах GNU 6.65E— это 6.659, что тоже не то, что вам нужно.

Вместо этого вы хотите, чтобы num2была строкой 6.65*10^7или 66500000.

$ num1=50.960; num2='6.65*10^7'; printf '%s < %s\n' "$num1" "$num2" | bc
1
2
18.03.2021, 22:24

Если вы хотите использовать num2 как есть, вы можете использовать awk:

awk -v num1="$num1" -v num2="$num2" 'BEGIN{exit num1<=num2}'

Это сравнит два числа и выдаст 1, если num1 меньше num2, или 0 в противном случае.

Обратите внимание, :это приведет к выходу из 1, если num1 и num2 равны, что является тем же поведением, которое вы увидите из bc в этом случае, если вы хотите, чтобы он вышел из 0 в этом случае вам нужно будет использовать вместо этого <из <=.

0
18.03.2021, 22:24

Да, bcмог выполнять все виды математических операций. Но он не понимает поплавки. printf современной оболочки понимает числа с плавающей запятой, но не может выполнять математику.

Давайте присоединимся к ним:

$ num1=50.960
$ num2=6.65E+07
$ printf '%f < %f\n' "$num1" "$num2" | bc -l
1
0
31.03.2021, 23:52

Теги

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