シェル

シェル

科学表記の値をシェルの10進数に変換するには? (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桁未満の10進数に変換します(64ビット浮動小数点の場合は有効数字53桁)[a]

    % printf "%.18f\n" "42.53e-12"
    0.000000000042530000
  • 2番目に(あなたの要件に応じて)
    乗算して再印刷します。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個の2進数(最大)40個の10進数です。素数として:

% 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

関連情報