bash中二次方程的计算解

时间:2019-05-20 15:26:44

标签: bash

感谢您抽出宝贵的时间阅读问题,因此基本上我的功课中有一些关于如何计算三项式解的问题。我知道该站点上还有其他教程,但我想向您展示我的想法并指导我解决所有问题。我尝试过在这里和那里更改一些代码或更改,但是没有太多

#!/bin/bash
read a
read b
read c

d=$((b*b-4*a*c))

if ((d>=0)); then
    calc=$(echo "sqrt ($d)" | bc )
    x1=$((-b/2*a+calc/2*a))
    x2=$((-b/2*a-calc/2*a))
    echo "$x1""$x2"
else
    echo "To trionimo den exei pragmatikes rizes"
fi

尝试任何一组数字后,它只会向我显示不同行中的错误。

2 个答案:

答案 0 :(得分:3)

这是一个作业问题。因此,我不会为您提供完整的解决方案,而是会为您提供信息并指出正确的方向。


一般说明:完成脚本编写后,将其复制粘贴到http://www.shellcheck.net中,并检查是否可能存在问题。如果shellcheck报告任何错误,请按照该页面上的建议链接并阅读有关如何解决问题的信息。另外,请尝试了解为什么这是一个问题。 (您也可以在系统上安装shellcheck程序)

关于数学的注释:您对x1x2的解决方案是错误的。符号$((-b/2*a+calc/2*a))实际上与a相乘,并且不会。因此它应显示为$(( (-b+calc)/(2*a) ))$(( (-b-calc)/(2*a) ))

关于bash的说明: Bash不了解浮点运算。

  

算术评估:在某些情况下,shell允许对算术表达式求值(请参阅let和声明          内置命令和算术扩展)。评估使用固定宽度的整数进行,不检查溢出,尽管陷阱会被除以0并标记为错误。

     

来源:man bash

这意味着bash解决方案仅在且仅当输入经过特别精心设计且必须满足以下条件时才能工作:

  1. 判别式d是一个完美的正方形。因此,它需要具有以下任何值:1 4 9 16 25 36 49 64 81 100 ... n^2

  2. 根据x1x2的解决方案,我们知道b必须被2*a整除,并且calc也是一样,因此,d必须被4*a*a整除。

只有少数无限组合可以满足此条件。

如果您希望解决方案是纯bash,则还意味着您不能使用任何其他工具,例如bcawkpythonperl 。可以在以下位置找到使用此类工具的此类变通方法的详细列表:How to do integer & float calculations, in bash or other languages/frameworks?,但是很遗憾,您无法使用此功能。但这使生活有些困难。

为此,我建议您在所有数学计算中使用bc -l

  • d=$( bc - l <<< "$b*$b - 4.0*$a*$c" )
  • calc=$( bc - l <<< "sqrt($d)" )
  • x1=$( bc -l <<< "(-$b+$calc)/(2.0*$a)" )

为避免使用echo,我们使用HERESTRING(请参阅man bash

您可以通过使用正则表达式测试d是否包含连字符(d)来检查-是否大于零(在{{1中搜索=~ }})

但是当您使用man bash时,这仍然是作弊行为。纯粹的打击很难。我看到的唯一方法是将所有数字乘以一个大数,然后再除以。 (所有这些都可以简单地通过使用字符串操作来完成。例如,如果输入为bc,则将其转换为2;如果输入为200000000,则将其转换为-2.5(如(如果乘以100000000)。-250000000可以通过查找表或简单的二进制搜索来完成。

答案 1 :(得分:0)

使用zsh代替bash note -l选项进行的一些更改

calc=$(echo "sqrt ($d)" | bc -l)