과학 표기법의 값을 쉘의 십진수로 변환하는 방법은 무엇입니까? (C 쉘이 선호됨)
또한 e-12에서 e-9로 변환한 다음 쉘로 변환하고 싶습니다.
42.53e-12 ~ 0.04253. 목록을 얻으려면 이 작업을 수행해야 합니다.
답변1
printf
이 작업은 쉘에서 수행됩니다.
$ FOO=42.53e-12
$ BAR=$(printf "%.14f" $FOO)
$ echo $BAR
0.00000000004253
$
고대+신비한 C쉘 속에는 이것이다.
$ set FOO=42.53e-12
$ set BAR=`printf "%.14f" $FOO`
$ echo $BAR
0.00000000004253
$
답변2
껍데기
많은 쉘(특히 고대 + 신비한 csh)은 부동 소수점 연산을 이해하지 못합니다.
printf
대부분의 쉘에는 "과학적 형식화"를 이해하는 내장 함수가 있습니다 .
$ printf '%5.0f\n' '1e3'
1000
하지만 모든 printf는 괜찮습니다.아니요수학을 해보세요:
$ printf '%5.0f\n' '1e3+1e3'
printf: ‘1e3+1e3’: value not completely converted
csh의 경우 2단계 솔루션이 있습니다. - 먼저
숫자를 18자리 미만의 십진수로 변환합니다(64비트 부동 소수점의 경우 유효 숫자 53자리) [a] :
% printf "%.18f\n" "42.53e-12"
0.000000000042530000
두 번째로 (귀하의 요구 사항에 따라)
곱하고 다시 인쇄하십시오.1e3
% printf '%.15f\n' "`printf "%.18f" "42.53e-12"`e3" 0.000000042530000
물론, printf
in은 csh
자체 부동 소수점 크기(64비트?)를 가진 외부 유틸리티이며 운영 체제마다 다를 수 있습니다.
수학 도구.
(셸 외부에서) 수학을 생각하는 것은 당연 bc
하지만 bc에는 고유한 한계가 있습니다( e
지수로 이해하지 못하고 로 변환해야 함 10^
).이것을 읽어보세요.
하지만 awk는 다음을 수행할 수 있습니다.
% echo 42.53e-12 | awk '{printf("%.15f\n", $1*1e3)}'
0.000000042530000
awk는 53개의 유효 숫자를 사용하므로 15개 이상의 정확한 숫자를 기대하지 마십시오. 더 많은 것을 얻으려면 임의 정밀도 모듈로 컴파일된 GNU 버전의 awk가 필요합니다.
% echo 42.53e-12 | awk -M -v PREC=134 '{printf("%.40g\n", $1*1e3)}'
4.253e-08
134개의 이진수(최대) 40개의 십진수입니다. 소수로:
% echo 42.53e-12 | awk -M -v PREC=134 '{printf("%.40f\n", $1*1e3)}'
0.0000000425300000000000000000000000000000
목록
귀하의 질문에서 귀하는 다음과 같이 말했습니다.
목록을 얻으려면 이 작업을 수행해야 합니다.
그러나 어떤 유형의 목록인지에 대한 세부 정보는 없습니다. 목록이 (셸 변수가 아닌) 파일 내부에 있는 경우 실행을 제외하고는 csh
아무 것도(또는 다른 셸) 수행할 필요가 없습니다.
% awk '{printf("%.15f\n", $1*1e3)}' <file
위와 동일한 정밀도 제한이 여전히 적용됩니다.
[ㅏ]실제로 기술적으로 먼저 printf 형식의 비트 수를 제한해야 하므로 %g
현명한 올바른 솔루션은 3단계 변환입니다.
합리적인 쉘(ksh, bash, zsh)에서는 다음과 같이 작동합니다.
$ bash -c 'printf "%.15f\n" "$(printf "%.18f" "$( printf "%.18g" "42.53e-12")" )e3"'
0.000000042530000
하지만 csh에서 double을 참조하는 것은 ` `
정말 어색하고 , csh는 set
변수에 할당하는 데 사용됩니다. 즉, 이는 다음에 적용됩니다 csh
.
$ csh -c 'set a=`printf "%.18g" "42.53e-12"`; set a=`printf "%.18f" "$a"`; printf "%.18f\n" "${a}e3"'
0.000000042530000000
하지만 정말 그렇습니다! csh를 피해야한다고 생각하십시오.
답변3
다음을 시도해 볼 수 있습니다.
echo "3.0000000000e+02" | awk '{printf("%d",$0);}'
또는 소수를 원할 경우
echo ""3.676361000e+02" | awk '{printf("%0.2f",$0);}'
답변4
아마도 최선의 해결책은 아닐 수도 있지만 약간의 트릭을 사용하여 이를 수행할 수 있었습니다. 당신은 이런 일을 할 수 있습니다 -
scientific='42.53e-12'
base=$(echo $scientific | cut -d 'e' -f1)
exp=$(($(echo $scientific | cut -d 'e' -f2)*1))
converted=$(bc -l <<< "$base*(10^$exp)")
>> .00000000004253000000