我正在编写一个简单的bash脚本,在默认情况下将平方根计算为小数点3位,但是用户可以设置位置的数目.没有什么复杂的,我只是从1迭代到最低平方根。因为我的狂欢仍然是基本的,这就是我想出来的。
#!/usr/bin/env bash
num=${1}
places=${2-3}
i=0
while [[ $(( i*i )) -lt ${num} ]] // <= The problem should be here
do
i=$(( i + 1 ))
done
echo ${i};
rem=$(( num % i ))
root="${i}."
for (( j=0; j<places; j++ ))
do
rem=$((rem * 10))
root="$root$((rem / i))"
rem=$((rem % i))
done
echo ${root}但由于某些原因,它不会产生正确的结果,范围广泛的数字,如bashfile.sh 9 // will produce 3.000 but bashfile.sh 8 will return 3.666善意的帮助,什么是while [[ ]]的问题
发布于 2019-10-22 13:50:43
这里有一个相当简单的解决方案,虽然不是很有效:
#!/bin/bash
num=$1
prec=${2:-3}
for (( i=0; i < prec; ++i )); do let num*=100; done
for (( sqrt=0; sqrt*sqrt <= num; ++sqrt )); do :; done
let --sqrt
sqrt="${sqrt:0:-prec}.${sqrt: -prec}"
echo $sqrt为了回答你的问题(“while [[ ]]有什么问题”),你的比较有点不正确。而不是-lt (即<),它应该是<=。在循环之后,您需要从i中减去1,才能得到平方根的整个正确部分。
我无法理解计算小数位的代码的第二部分。然而,一个简单的解决方案是将原始数字进行预乘以获得所需的精度,这就是我前面所做的。
更新
正如@dash-o所指出的,如果您使用bash,您很可能安装了bc或awk,它们更适合于此:
num=$1
prec=${2:-3}
# using bc
echo "scale=$prec; sqrt($num)" | bc
# using awk
awk "BEGIN {printf \"%.${prec}f\n\", sqrt($num)}"发布于 2019-10-22 13:28:55
上面的代码试图在几个步骤中计算带有十进制的sqrt:
然而,这是不正确的。代码假定N被分解为= (II) + (D_I),但是需要找到N= (D+I)(D+I) = DD + I_I + 2(D+I)
有两种可能的备选办法:
将数字乘以10^( PREC *2),以sqrt作为整数,然后在小数点后用最后一个
实施备选方案1:
PREC=3 # Precision
V=123456 # input
for ((i=1 ; i<=PREC ; i++ )) ; do
V=V*100
done
# Loop for matching i as abovehttps://stackoverflow.com/questions/58504931
复制相似问题