【问题标题】:How do I stop bc from splitting lines?如何阻止 bc 拆分行?
【发布时间】:2010-11-26 03:00:28
【问题描述】:

我正在使用 bash 脚本中的 bc 进行一些快速而肮脏的 BigInteger 数学运算,但是当我提高比例时,它开始在我身上分割线:

pax> echo 'scale=200 ; 1 / 4' | bc
.2500000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000

pax> num="$(echo 'scale=200 ; 1 / 4' | bc )" ; echo $num
.2500000000000000000000000000000000000000000000000000000000000000000\ 00000 ...

我该如何阻止这种情况发生,以便我可以在没有任何拆分的情况下获得号码?手册页记录了这种行为,但似乎没有提供任何更改它的选项。


实际上,我会退后一步告诉您请求的来源,以防万一有人有更好的解决方案。我需要一个 C 中的字符串数组,相当于值 2-n,如下所示:

static char *str[] = {
    "1.00000000 ... 000",     // 1/1 to 150 fractional places.
    "0.50000000 ... 000",     // 1/2
    "0.25000000 ... 000",     // 1/4
    "0.12500000 ... 000",     // 1/8
    : : :
    "0.00000000 ... 004",     // 1/(2^256)
};

我不关心生成数组的语言是什么,我只是将输出插入到我的 C 代码中。不过我确实需要准确度。

【问题讨论】:

  • 一开始就避免使用bcbash 不是更简单吗?一个简单的 Python 程序可能会比这更容易。你为什么坚持bc

标签: biginteger bc


【解决方案1】:

至少在我的系统上,BC_LINE_LENGTH 环境变量控制输出行的长度:

$ echo 'scale=200; 1/4' | BC_LINE_LENGTH=9999 bc
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

【讨论】:

  • 设置 BC_LINE_LENGTH=0 会禁用多行功能(根据 GNU bc 手册页)。
  • 啊啊啊啊!该死的less 及其区分大小写的搜索——我找了length,但什么也没找到。 LENGTH 会带我完全正确的部分。
  • 我更喜欢默认区分大小写并从less 中键入-i 以使其不区分大小写,但许多人使用LESS 环境变量默认设置-i(在系统这是默认设置,我通过重新打开它来迷惑自己)。
【解决方案2】:
localhost:~ slott$ python -c 'print "{0:.200f}".format( 1./4. )'
0.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


localhost:~ slott$ python -c 'import decimal; print 1/decimal.Decimal( 2**256 )'
8.636168555094444625386351863E-78

import decimal
for i in range(256):
    print "{0:.150f}".format(1/decimal.Decimal(2**i))

这是原始值。

如果您想创建正确的 C 语法,请使用类似的内容。

def long_string_iter():
    for i in range(256):
        yield i, "{0:.150f}".format(1/decimal.Decimal(2**i))

def c_syntax( string_iter ):
   print "static char *str[] = {"
   for i, value in string_iter():
       print '    "{0}", // 1/{1}'.format( value, i )
   print "};"

这可能会做你想要的。

【讨论】:

  • 我需要这个去大约 150 个小数位数(可能只有 100 个,但为了安全起见) - Python 有这个能力吗(特别是 1/(2^256) = 8.6361685550944446253863518628004e-78)?
  • @paxdiablo: 150 个小数位?那你算错了。做一些代数并摆脱除法。 Python 可以处理不定数量的数字。但是,取决于除法运算符会在事物的右侧引入噪声位。一个糟糕的、糟糕的设计。
【解决方案3】:
% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2019-10-10
    • 1970-01-01
    • 2023-02-09
    • 2015-12-14
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多