【问题标题】:bc calculation with large float number [closed]大浮点数的 bc 计算 [关闭]
【发布时间】:2018-11-22 14:32:35
【问题描述】:

我有一个很大的数字,我想进行 bc 计算。 示例:

T_Mab = 6.00899e+09

我想这样打印:

echo 'T_Mab =   '${T_Mab}' [s] = '${T_Mab}/31557600' [year]' | bc -l

它给了我“语法错误”。那我该怎么做呢?

【问题讨论】:

  • 该示例看起来不完整 - ${T_Mab_y} 未定义。您应该能够进一步简化它!例如。 bc -l <<<"6.00899e+09"(这给了我一个语法错误 - 我不认为 bc 读取“e”符号)。
  • 您是否像显示的那样设置了它,= 周围有空格?不可能有。
  • 另外,在交互式 bc 会话中尝试您的命令。变量名不能包含大写字符
  • 第三,这只会将您的结果分配给bc 变量,之后该变量会立即消失。你的意思是像T_Mab=$(echo '...' | bc -l) 这样的东西吗?

标签: bash calculation bc


【解决方案1】:

你不能只写你想显示的任何内容并将它们转储到bc。另一个问题是bc 不接受科学记数法。详情请查看 [How to get bc to handle numbers in scientific (aka exponential) notation?

假设数字已经转换为链接问题中答案中的正确形式,您可以在bash中这样写。

T_Mab=6008990000
echo "${T_Mab} [s] = $(bc -l <<< ${T_Mab}/31557600) [year]"

这里的字符串是从bash 3.0 开始添加的,如果您使用的是旧版本,请使用$(echo ${T_Mab}/31557600|bc -l)

综上所述,如果您不需要任意精度,您真的应该考虑链接问题的第二个答案中建议的bc 替代方案。

【讨论】:

  • 也许我应该完整地编写我的脚本...问题是我有一个文件 10 列,第一个是与我用作示例的数字相同的符号以秒为单位的时间。第二列是 ID。所以我需要从定义的 ID 中找到平均时间
  • 您需要将所有这些信息连同示例输入、您正在使用的当前脚本以及预期输出一起放入您的问题中,以阐明您想要实现的目标。不要把这些放在 cmets 中。
【解决方案2】:

语法错误是因为bc不读取“e”符号,可以用一个大大简化的例子来重现:

$ bc -l <<<"6.00899e+09"
(standard_in) 1: syntax error

我们需要改成它能够理解的语法;我们可以在 Bash 中做到这一点:

v=6.00899e+09
v=${v/e/*10^}    # 6.00899*10^+09
v=${v/^+/^}      # 6.00899*10^09
bc -l <<<"($v)"
6008990000.00000

或者干脆通过理解符号的工具进行清洗:

printf '%f\n' "$v" | bc -l

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 2013-12-31
    • 1970-01-01
    • 2017-08-14
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多