Как мне остановиться до н.э. от расщепленных линий?
-
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