Cách thực hiện phép toán dấu phẩy động trong tập lệnh Bash Linux

Tác giả sysadmin, T.M.Một 11, 2023, 02:20:16 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách thực hiện phép toán dấu phẩy động trong tập lệnh Bash Linux


Khi đủ gần vẫn chưa đủ tốt, bạn cần số dấu phẩy động.

  • Shell Linux Bash chỉ hỗ trợ số học số nguyên và không thể thực hiện các phép tính trên số dấu phẩy động.
  • Tiện ích bc trong Linux cho phép tính toán dấu phẩy động chính xác một cách tương tác và trong các tập lệnh shell.
  • Sử dụng bc, bạn có thể đặt số vị trí thập phân để hiển thị và thực hiện các phép tính với độ chính xác tùy ý, bao gồm cả việc sử dụng các hàm từ thư viện toán học tiêu chuẩn.

Shell Linux Bash chỉ hỗ trợ số học số nguyên. Nó không thể hiểu cũng như không thể xử lý được các phép tính dấu phẩy động. Tiện ích bc cung cấp cho bạn các phép tính dấu phẩy động chính xác một cách tương tác và trong các tập lệnh shell.

1. Tại sao Bash chỉ hỗ trợ số nguyên

Quyết định thiết kế ban đầu nhằm hạn chế shell Unix Bourne đối với số học số nguyên có thể bắt nguồn từ việc ánh xạ tính toán ban đầu của một số nguyên thành một byte RAM. Chúng ta có thể không bao giờ biết điều gì thực sự đằng sau quyết định này. Cũng không phải vì vấn đề đó mà tại sao phiên bản Linux của shell Bourne, shell Bash, lại chọn làm theo.

Bản thân Bash không thể thực hiện các phép tính trên số dấu phẩy động và các phép tính trên số nguyên có phần phân số trong câu trả lời sẽ được báo cáo dưới dạng giá trị số nguyên bị cắt cụt. Điều này đúng trên dòng lệnh và trong các tập lệnh shell Bash. Tùy thuộc vào trường hợp sử dụng của bạn, điều này có thể gây ra sự cố hoặc dừng hiển thị.

Linux có hai ứng dụng tiện ích cho phép bạn thực hiện các phép tính dấu phẩy động. Một trong số đó là dc. Đó là một thứ đồ cổ, hoạt động giống như ký hiệu tiếng Ba Lan ngược. Công cụ khác là bc. Nó có thể được sử dụng tương tác hoặc như một lệnh và đó là giải pháp mà chúng ta sẽ thảo luận ở đây.

2. Vấn đề

Hãy yêu cầu Bash chia sáu cho ba.

Mã nguồn [Chọn]
echo $((6 / 3))

Chúng tôi nhận được câu trả lời mong đợi của chúng tôi là hai. Bây giờ hãy chia sáu cho bảy. Rõ ràng, điều đó sẽ có một câu trả lời phân số.

Mã nguồn [Chọn]
echo $((6 / 7))

Zero rõ ràng là sai. Hãy thử lại, chia 16 cho 7.

Mã nguồn [Chọn]
echo $((16 / 7))

Chúng tôi nhận được câu trả lời là hai. Điều đang xảy ra là phần phân đoạn của câu trả lời đang bị loại bỏ, do đó câu trả lời bị cắt bớt. Không có phần phân số trong ví dụ đầu tiên nên chúng ta nhận được câu trả lời đúng.

Ví dụ thứ hai không có phần tử số nguyên trong câu trả lời, chỉ có phần phân số. Bởi vì phần phân số đã bị loại bỏ nên kết quả chúng ta thấy là 0.

Trong ví dụ thứ ba, 7 chia thành 16 hai lần với số dư là phân số. Một lần nữa, phần còn lại bị loại bỏ và kết quả bị cắt bớt.

3. Sử dụng bc một cách tương tác

Bạn có thể sử dụng bc làm máy tính tương tác bằng cách nhập bc và nhấn phím "Enter".

Mã nguồn [Chọn]
bc


Ứng dụng bc khởi chạy, thông báo số phiên bản của nó và sau đó chờ thông tin đầu vào của bạn. Nhập một phép tính và nhấn "Enter" để bc đánh giá phép tính và hiển thị câu trả lời.

Mã nguồn [Chọn]
16 * 4

1024 / 32

2^2 * 1024


Bạn có thể sử dụng "Ctrl+L" để xóa màn hình và "Ctrl+D" để thoát khỏi chương trình. Hãy thử một phép tính có thành phần phân số trong câu trả lời.

Mã nguồn [Chọn]
22 / 7

Đó không phải là điều chúng tôi mong đợi. Ngược lại, mặc dù bc cho phép chúng ta sử dụng độ chính xác tùy ý, nhưng theo mặc định, nó sẽ không hiển thị dấu thập phân cũng như bất kỳ số liệu nào theo sau nó.

Để hiển thị câu trả lời đúng, chúng ta cần cho bc biết cần hiển thị bao nhiêu chữ số thập phân. Chúng tôi thực hiện việc này bằng lệnh "scale". Chúng tôi sẽ yêu cầu bảy chữ số thập phân và thực hiện lại phép tính của mình.

Mã nguồn [Chọn]
scale=7
22 / 7


Cuối cùng thì chúng ta cũng đến được một nơi nào đó. Cài đặt "tỷ lệ" vẫn được giữ nguyên cho đến khi bạn thay đổi nó. Việc đặt số vị trí thập phân sẽ cho bc biết số lượng vị trí tối đa cần hiển thị. Nếu một câu trả lời không cần nhiều chữ số thập phân thì nó sẽ được hiển thị với số chữ số thập phân mà nó yêu cầu và không nhiều hơn. Nó không được đệm bằng những số 0 vô nghĩa.
 
Mã nguồn [Chọn]
scale=10
0.300003 * 0.5


Bạn có thể liệt kê các phép tính khác nhau trên cùng một dòng bằng cách sử dụng dấu chấm phẩy ";" để tách chúng ra. Các câu trả lời được hiển thị trên mỗi dòng như thường lệ, theo thứ tự các phép tính được liệt kê.
 
Mã nguồn [Chọn]
25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9

Bạn cũng có thể đưa lệnh "scale" vào danh sách.
 
Mã nguồn [Chọn]
scale=8; 22 / 7; scale=3; 0.3 * 0.071

4. Thư viện toán chuẩn

Tùy chọn -l (thư viện toán học tiêu chuẩn) khiến bc tải một tập hợp các hàm và đặt "tỷ lệ" thành 20 chữ số thập phân.

Mã nguồn [Chọn]
bc -l
22 / 7


Với thư viện tiêu chuẩn được tải, bạn có thể sử dụng các hàm này trong tính toán của mình.

  • s(x) : Sin của x
  • c(x) : Cosin của x.
  • a(x) : Arctang của x
  • l(x) : Logarit tự nhiên của x
  • e(x) : Hàm mũ của e lũy thừa giá trị x
  • j(n,x) : Hàm Bessel bậc nguyên n của x.

Sin, cosin và arctang sử dụng các giá trị radian.

  • s (1.1)
  • c (.891207)
  • a (.628473)


5. Gửi đầu vào tới bc trên dòng lệnh

Bạn có thể sử dụng chuyển hướng và đường ống để gửi đầu vào tới bc. Nó xử lý thông tin đầu vào của bạn và hiển thị câu trả lời trong cửa sổ terminal.

Bạn có thể chuyển hướng sang bc có hoặc không có tùy chọn -l (thư viện toán chuẩn).

Mã nguồn [Chọn]
bc <<< 22/7
bc -l <<< 22/7


Để chuyển đầu vào thành bc, đầu vào phải là đầu ra của một quy trình khác. Thật thuận tiện khi sử dụng echo cho việc này.

Mã nguồn [Chọn]
echo 22/7 | bc
echo 22/7 | bc -l


Nếu bạn có khoảng trắng trong nội dung nhập hoặc muốn bao gồm lệnh "tỷ lệ", hãy đặt nội dung nhập của bạn trong dấu ngoặc kép.
 
Mã nguồn [Chọn]
echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc


6. Sử dụng bc trong tập lệnh Bash Shell

Bây giờ chúng tôi đã có tất cả những gì cần thiết để có thể thực hiện các phép tính dấu phẩy động trong tập lệnh bash với độ chính xác đã chọn. Chúng ta cũng có thể tham chiếu các biến Bash trong các phép tính của mình, bao gồm các tham số cho tập lệnh.

Đây là kịch bản ví dụ của chúng tôi. Sao chép văn bản này vào trình chỉnh sửa, lưu nó dưới dạng "pi.sh", sau đó đóng trình chỉnh sửa của bạn.

Mã nguồn [Chọn]
#!/bin/bash

first_number=22
second_number=7

pi=$(echo "scale=$1; $first_number/$second_number" | bc)

echo "Pi to $1 decimal places is: $pi"

Chúng tôi sử dụng hai biến, "first_number" và "second_number" để chứa hai giá trị số. Chúng tôi sử dụng các biến đó trong dữ liệu đầu vào mà chúng tôi chuyển vào bc.

Chúng tôi cũng đã sử dụng tham số dòng lệnh đầu tiên được truyền cho tập lệnh, "$1", làm giá trị để đặt "tỷ lệ" thành.

Trước khi có thể thử tập lệnh của mình, chúng ta cần làm cho tập lệnh có thể thực thi được bằng chmod.

Mã nguồn [Chọn]
chmod +x pi.sh

Hãy thử tập lệnh của chúng tôi với các giá trị dòng lệnh khác nhau.

Mã nguồn [Chọn]
./pi.sh 5
./pi.sh 14
./pi.sh 20


Chúng tôi hiển thị số pi ở số vị trí mà chúng tôi chỉ định trên dòng lệnh cho tập lệnh của mình.

7. Nó tất cả cho biết thêm

Vượt ra ngoài giới hạn của toán học chỉ có số nguyên của Bash mang lại cho tập lệnh của chúng tôi độ chính xác và chính xác.

Việc sử dụng echo để chuyển đầu vào thành bc bên trong các tập lệnh hơi rắc rối nhưng nó hoạt động hoàn toàn tốt và mang lại những lợi ích xứng đáng.