如何执行此计算并将其输出到标准输出?

时间:2017-11-12 03:58:47

标签: bash math syntax echo stdout

我试图在Bash中这样做:

read n

echo int(math.ceil((math.sqrt(1 + 8 * n) - 1) / 2))

当然这不是合法的语法,但我只是把它放在那里,这样你就可以告诉我想要做什么。

有没有一种简单的方法可以将其变为有效的Bash?

3 个答案:

答案 0 :(得分:2)

虽然你要求在Bash中执行此操作,但是对于平方根或天花板等功能没有原生支持。委托给Perl会更简单:

perl -wmPOSIX -e "print POSIX::ceil((sqrt(1 + 8 * $n) - 1) / 2)"

或者,您可以使用bc来计算平方根,并使用一些Bash来计算上限。

让我们定义一个函数,用sqrt bc打印公式的结果:

formula() {
    local n=$1
    bc -l <<< "(sqrt(1 + 8 * $n) - 1) / 2"
}

-l标志将scale从默认值0更改为20。 这会影响浮点结果显示的比例。 例如,默认为零,10 / 3将仅打印3。 我们需要在下一步中使用浮点详细信息来计算上限。

ceil() {
    local n=$1
    local intpart=${n%%.*}
    if [[ $n =~ \.00*$ ]]; then
        echo $intpart
    else
        echo $((intpart + 1))
    fi
}

这里的想法是提取整数部分, 如果小数部分全部为零,那么我们只打印整数部分, 否则整数部分+ 1,因为它是上限。

最后一个简单的函数,结合上述函数来获得你想要的结果:

compute() {
    local n=$1
    ceil $(formula $n)
}

还有一个检查功能来测试它:

check() {
    local n num
    for n; do
        num=$(formula $n)
        echo $n $num $(compute $n)
    done
}

让我们试一试:

check 1 2 3 4 7 11 12 16 17

它产生:

1 1.00000000000000000000 1
2 1.56155281280883027491 2
3 2.00000000000000000000 2
4 2.37228132326901432992 3
7 3.27491721763537484861 4
11 4.21699056602830190566 5
12 4.42442890089805236087 5
16 5.17890834580027361089 6
17 5.35234995535981255455 6

答案 1 :(得分:1)

您可以使用sqrt的{​​{1}}功能。

echo "(sqrt(1 + 8 * 3) - 1) / 2" | bc

Ceil函数可以使用本答案中描述的任何方法实现。

Getting Ceil integer

例如:

  ceiling_divide() {
      ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
    }

答案 2 :(得分:1)

您可以将bc用于所有作业

$>cat filebc

print "Enter a number\n";
scale=20
a=read()
b=((sqrt(1 + 8 * a) - 1) / 2)
scale=0
print "ceil = ";
((b/1)+((b%1)>0))
quit

将其称为

bc -q filebc