科学表記の値をシェルの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
もちろん、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個の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