用科学记数法显示积分?

用科学记数法显示积分?

我有一个积分值:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
2400000

我将它分配给 shell 变量:

CPU_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)

我想使用 bash 从 shell 脚本中以科学格式显示它。此外,我需要将它用作程序的参数。这就是我想要的:

echo $CPU_FREQ
2.4+1e9

网上有一些热门内容,但对我来说如何修改它们并不明显,因为我通常使用 C/C++/Objective C。请参见,例如,bash以科学记数法显示积分删除科学计数法 bash 脚本

有没有办法将积分转换为科学记数法?

或者如何显示数值的科学计数法?

答案1

这应该很简单:

printf "%g" $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)

或者,使用 perl:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq | perl -e 'printf("%g\n", <>)'

您请求的格式似乎有点奇怪,但这两个示例将使用科学记数法打印数字。

答案2

事实上,正如@Jan 提到的,您可以将 printf 与 %e 一起使用。 @Will 提到了选项 %g,但这不一定是科学计数法(见下文)。

它基于您已经知道的 C 的 printf 。

CPU_FREQ=$(printf "%e" $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq))

printf 命令的工作原理如下:

var=1
printf "print a float variable %f, or an integer literal. %d" $var 2

您可以使用 %g、%e、%G 或 %E。另外,还可以使用可选的额外文字整数参数 a,b,例如:%a.bf

简而言之,可选参数 a 是最小宽度大小(如果在变量中转发输出,则忽略该参数)。

%.be 精确地使用 b 位小数打印它,如有必要,则用零对填充进行四舍五入。 %.bg 打印带有 b 位有效数字的结果,忽略所有尾随零。 (它也可以被认为是 %f 和 %e 两个之间较短的一个,但再次值得注意的是,它没有尾随零。)

例子:

R=10000001
printf "%e\n"  $R
1.000000e+07
printf "%g\n" $R
1e+07

R=1.0000001 
printf "%e\n"  $R
1.000000e+00
printf "%g\n" $R
1

R=1000000.1    
printf "%e\n"  $R
1.000000e+06
printf "%g\n" $R
1e+06

R=.10000001
printf "%e\n"  $R
1.000000e-01
printf "%g\n" $R 
0.1

(%G 和 %E 就像 %g 和 %e 一样,但它们以大写形式打印输出,这只适用于变成 E 的 e。)

相关内容