Как мне остановиться до н.э. от расщепленных линий?

StackOverflow https://stackoverflow.com/questions/4282246

  •  28-09-2019
  •  | 
  •  

Вопрос

я использую bc От скрипта Bash, чтобы сделать немного быстрого и грязного Biginteger Math, но, когда я натянул масштаб, он начинает расщепляться на меня:

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

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

Как я могу остановить это, чтобы я мог просто получить номер без каких-либо расщеплений? Страница человека документирует это поведение, но, похоже, не дает никаких вариантов изменения его.


На самом деле, я вернусь и скажу, что источник запроса на случай, если у кого-то есть лучшее решение. Мне нужен массив строк в C, эквивалентен значениям 2-На, вдоль линии:

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-коду. Однако мне нужна точность.

Это было полезно?

Решение

По крайней мере, в моей системе, вариабельная среда BC_LINE_LENGENGENGING, как долго выходные линии:

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

Другие советы

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 "};"

Это может сделать то, что вы хотите.

% echo 'scale=200; 1/4' | bc | tr -d '\n' | tr -d '\\'
.25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top