首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算bash中的平方根到小数位

计算bash中的平方根到小数位
EN

Stack Overflow用户
提问于 2019-10-22 13:01:20
回答 2查看 1K关注 0票数 3

我正在编写一个简单的bash脚本,在默认情况下将平方根计算为小数点3位,但是用户可以设置位置的数目.没有什么复杂的,我只是从1迭代到最低平方根。因为我的狂欢仍然是基本的,这就是我想出来的。

代码语言:javascript
复制
#!/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 [[ ]]的问题

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-22 13:50:43

这里有一个相当简单的解决方案,虽然不是很有效:

代码语言:javascript
复制
#!/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,它们更适合于此:

代码语言:javascript
复制
num=$1
prec=${2:-3}

# using bc
echo "scale=$prec; sqrt($num)" | bc

# using awk
awk "BEGIN {printf \"%.${prec}f\n\", sqrt($num)}"
票数 2
EN

Stack Overflow用户

发布于 2019-10-22 13:28:55

上面的代码试图在几个步骤中计算带有十进制的sqrt:

  • 计算N的整数部分,存储为I
  • 求R=N*i的十进制部分,除以I.

然而,这是不正确的。代码假定N被分解为= (II) + (D_I),但是需要找到N= (D+I)(D+I) = DD + I_I + 2(D+I)

有两种可能的备选办法:

将数字乘以10^( PREC *2),以sqrt作为整数,然后在小数点后用最后一个

  • 数字打印该数字。
  • Escape到一个能够实现十进制数字的工具(awk,bc或十进制计算作为先搜索)。

实施备选方案1:

代码语言:javascript
复制
PREC=3   # Precision
V=123456  # input
for ((i=1 ; i<=PREC ; i++ )) ; do
  V=V*100
done
# Loop for matching i as above
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58504931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档