껍데기

껍데기

과학 표기법의 값을 쉘의 십진수로 변환하는 방법은 무엇입니까? (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
    

물론, printfin은 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

관련 정보