Nhân hai số dấu phẩy động trong python

Trong bài đăng này, chúng ta sẽ tìm hiểu cách nhân hai số dấu phẩy động bằng một hàm riêng biệt. Chúng tôi sẽ viết một hàm riêng biệt sẽ lấy các số làm tham số và trả về giá trị nhân

Nếu chúng ta sử dụng một hàm, chúng ta có thể đặt tất cả mã có thể tái sử dụng vào hàm đó và gọi hàm đó từ các phần khác nhau của chương trình

Một hàm có thể lấy bất kỳ số lượng giá trị nào làm tham số và nó có thể trả về kết quả cho người gọi. Trong ví dụ này, hàm sẽ lấy hai số dấu phẩy động làm tham số và nó sẽ trả về tích của hai số này

Chương trình Python để nhân hai số thực bằng hàm

Hãy cùng xem chương trình dưới đây

def multiply(first_no, second_no):
    return first_no*second_no


print(multiply(10.0, 2.0))
print(multiply(15.23, 12.98))

Nó sẽ in đầu ra bên dưới

Đây,

  • nhân là một hàm lấy hai số làm tham số và trả về phép nhân của nó
  • Các câu lệnh in đang gọi hàm nhân với hai số dấu phẩy động khác nhau cho mỗi

Chương trình Python để nhân hai số thực bằng hàm và số do người dùng nhập

Chúng tôi cũng có thể lấy các số làm đầu vào của người dùng. Tương tự như chương trình trên, chúng ta có thể gọi hàm với các giá trị người dùng nhập vào và nó sẽ in kết quả

Nhân các số dấu phẩy động

Cải thiện bài viết

Lưu bài viết

Thích bài viết

  • Độ khó. Cơ bản
  • Cập nhật lần cuối. 04/05/2020

  • Đọc
  • thảo luận(1)
  • khóa học
  • Luyện tập
  • Băng hình
  • Cải thiện bài viết

    Lưu bài viết

    Điều kiện tiên quyết – Số dấu phẩy động 754 tiêu chuẩn IEEE
    Sự cố. -
    Ở đây, chúng ta đã thảo luận về thuật toán nhân hai số dấu phẩy động, x và y.

    thuật toán. -

    1. Chuyển đổi các số này thành ký hiệu khoa học, để chúng ta có thể biểu diễn rõ ràng 1 ẩn
    2. Đặt 'a' là số mũ của x và 'b' là số mũ của y
    3. Giả sử kết quả số mũ c = a+b. Nó có thể được điều chỉnh sau bước tiếp theo
    4. Nhân phần định trị của x với phần định trị của y. Gọi kết quả này là m
    5. Nếu m không còn 1 điểm cơ số bên trái, thì hãy điều chỉnh điểm cơ số để nó có và điều chỉnh số mũ c để bù
    6. Thêm các bit dấu, mod 2, để có dấu của phép nhân kết quả
    7. Chuyển đổi trở lại biểu diễn dấu phẩy động một byte, cắt bớt bit nếu cần

    Ghi chú.
    Các giá trị âm rất dễ xử lý trong phép nhân dấu phẩy động. Coi bit dấu là nhị phân không dấu 1 bit, thêm mod 2. Điều này giống như XORing bit dấu.

    Ví dụ. -
    Giả sử bạn muốn nhân hai số sau.

    Nhân hai số dấu phẩy động trong python

    Bây giờ, đây là các bước theo thuật toán trên

    1. Cho trước, A = 1. 11 x 2^0 và B = 1. 01x2^2
    2. Vì vậy, số mũ c = a + b = 0 + 2 = 2 là số mũ kết quả
    3. Bây giờ, nhân 1. 11 trên 1. 01, vì vậy kết quả sẽ là 10. 0011
    4. Chúng ta cần bình thường hóa 10. 0011 đến 1. 00011 và điều chỉnh số mũ 1 nhân 3 một cách thích hợp
    5. Kết quả bit dấu 0 (XOR) 0 = 0, nghĩa là dương
    6. Bây giờ, cắt ngắn và bình thường hóa nó 1. 00011 x 2^3 đến 1. 000 x 2^3

    Do đó, số kết quả là,

    Nhân hai số dấu phẩy động trong python

    Tương tự, chúng ta có thể nhân các số dấu phẩy động khác

    Ghi chú cá nhân của tôi arrow_drop_up

    Tiết kiệm

    Vui lòng Đăng nhập để nhận xét.

    Các số dấu phẩy động được biểu diễn trong phần cứng máy tính dưới dạng phân số cơ số 2 (nhị phân). Ví dụ: phân số thập phân

    0.333
    
    6 có giá trị 1/10 + 2/100 + 5/1000 và theo cách tương tự, phân số nhị phân
    0.333
    
    7 có giá trị 0/2 + 0/4 + 1/8. Hai phân số này có các giá trị giống hệt nhau, sự khác biệt thực sự duy nhất là phân số đầu tiên được viết theo ký hiệu phân số cơ số 10 và phân số thứ hai trong cơ số 2

    Thật không may, hầu hết các phân số thập phân không thể được biểu diễn chính xác dưới dạng phân số nhị phân. Hệ quả là, nói chung, các số dấu phẩy động thập phân bạn nhập chỉ gần đúng với các số dấu phẩy động nhị phân thực sự được lưu trữ trong máy

    Vấn đề dễ hiểu hơn lúc đầu ở cơ sở 10. Xét phân số 1/3. Bạn có thể tính gần đúng dưới dạng phân số cơ số 10

    0.3
    

    hoặc tốt hơn,

    0.33
    

    hoặc tốt hơn,

    0.333
    

    và như thế. Cho dù bạn sẵn sàng viết ra bao nhiêu chữ số, kết quả sẽ không bao giờ chính xác là 1/3, mà sẽ là một xấp xỉ ngày càng tốt hơn của 1/3

    Theo cách tương tự, cho dù bạn sẵn sàng sử dụng bao nhiêu chữ số cơ số 2, thì giá trị thập phân 0. 1 không thể biểu diễn chính xác dưới dạng phân số cơ số 2. Trong cơ số 2, 1/10 là phân số lặp lại vô hạn

    0.0001100110011001100110011001100110011001100110011...
    

    Dừng lại ở bất kỳ số bit hữu hạn nào và bạn nhận được xấp xỉ. Trên hầu hết các máy hiện nay, số float được xấp xỉ bằng cách sử dụng phân số nhị phân với tử số sử dụng 53 bit đầu tiên bắt đầu bằng bit quan trọng nhất và với mẫu số là lũy thừa của hai. Trong trường hợp 1/10, phân số nhị phân là

    0.333
    
    8 gần bằng nhưng không chính xác bằng giá trị thực của 1/10

    Nhiều người dùng không biết về giá trị gần đúng do cách hiển thị các giá trị. Python chỉ in một giá trị thập phân gần đúng với giá trị thập phân thực của xấp xỉ nhị phân được máy lưu trữ. Trên hầu hết các máy, nếu Python in giá trị thập phân thực của xấp xỉ nhị phân được lưu trữ cho 0. 1, nó sẽ phải hiển thị

    ________số 8

    Đó là nhiều chữ số hơn hầu hết mọi người thấy hữu ích, vì vậy Python giữ cho số lượng chữ số có thể quản lý được bằng cách hiển thị một giá trị được làm tròn thay thế

    >>> 1 / 10
    0.1
    

    Chỉ cần nhớ, mặc dù kết quả được in trông giống như giá trị chính xác là 1/10, nhưng giá trị được lưu trữ thực tế là phân số nhị phân có thể biểu thị gần nhất

    Điều thú vị là có nhiều số thập phân khác nhau có cùng phân số nhị phân gần đúng nhất. Ví dụ: các số

    0.333
    
    9 và
    0.0001100110011001100110011001100110011001100110011...
    
    0 và
    0.0001100110011001100110011001100110011001100110011...
    
    1 đều xấp xỉ bằng
    0.333
    
    8. Vì tất cả các giá trị thập phân này có cùng giá trị gần đúng, nên bất kỳ giá trị nào trong số chúng đều có thể được hiển thị trong khi vẫn bảo toàn giá trị bất biến
    0.0001100110011001100110011001100110011001100110011...
    
    3

    Trong lịch sử, dấu nhắc Python và hàm tích hợp sẽ chọn một chữ số có 17 chữ số có nghĩa,

    0.0001100110011001100110011001100110011001100110011...
    
    0. Bắt đầu với Python 3. 1, Python (trên hầu hết các hệ thống) hiện có thể chọn cái ngắn nhất trong số này và chỉ cần hiển thị
    0.333
    
    9

    Lưu ý rằng đây là bản chất của dấu phẩy động nhị phân. đây không phải là lỗi trong Python và nó cũng không phải là lỗi trong mã của bạn. Bạn sẽ thấy cùng một thứ trong tất cả các ngôn ngữ hỗ trợ số học dấu phẩy động của phần cứng của bạn (mặc dù một số ngôn ngữ có thể không hiển thị sự khác biệt theo mặc định hoặc trong tất cả các chế độ đầu ra)

    Để có kết quả dễ chịu hơn, bạn có thể muốn sử dụng định dạng chuỗi để tạo ra một số lượng hạn chế các chữ số có nghĩa

    0.333
    
    7

    Điều quan trọng là phải nhận ra rằng đây thực sự là một ảo ảnh. bạn chỉ đơn giản là làm tròn hiển thị giá trị thực của máy

    Một ảo tưởng có thể sinh ra một ảo tưởng khác. Ví dụ, kể từ 0. 1 không chính xác là 1/10, tổng ba giá trị của 0. 1 có thể không mang lại chính xác 0. 3, một trong hai

    0.333
    
    8

    Ngoài ra, kể từ 0. 1 không thể tiến gần hơn đến giá trị chính xác của 1/10 và 0. 3 không thể tiến gần hơn đến giá trị chính xác của 3/10, thì việc làm tròn trước bằng hàm không thể giúp được

    0.333
    
    9

    Mặc dù các số không thể được thực hiện gần hơn với các giá trị chính xác dự định của chúng, nhưng hàm này có thể hữu ích cho việc làm tròn sau để các kết quả có giá trị không chính xác có thể so sánh được với nhau

    0.333
    
    0

    Số học dấu phẩy động nhị phân có nhiều bất ngờ như thế này. Vấn đề với “0. 1” được giải thích chi tiết chính xác bên dưới, trong phần “Lỗi trình bày”. Xem The Perils of Floating Point để có tài khoản đầy đủ hơn về những bất ngờ phổ biến khác

    Như đã nói ở gần cuối, “không có câu trả lời dễ dàng. ” Tuy nhiên, đừng quá cảnh giác với dấu phẩy động. Các lỗi trong thao tác dấu phẩy động của Python được kế thừa từ phần cứng dấu phẩy động và trên hầu hết các máy theo thứ tự không quá 1 phần trong 2**53 cho mỗi thao tác. Điều đó là quá đủ cho hầu hết các nhiệm vụ, nhưng bạn cần lưu ý rằng đó không phải là số học thập phân và mọi thao tác float có thể gặp lỗi làm tròn mới

    Mặc dù vẫn tồn tại các trường hợp bệnh lý, nhưng đối với hầu hết việc sử dụng thông thường số học dấu phẩy động, bạn sẽ thấy kết quả mà bạn mong đợi cuối cùng nếu bạn chỉ làm tròn phần hiển thị kết quả cuối cùng của mình thành số chữ số thập phân mà bạn mong đợi. thường là đủ và để kiểm soát tốt hơn, hãy xem thông số định dạng của phương thức trong

    Đối với các trường hợp sử dụng yêu cầu biểu diễn số thập phân chính xác, hãy thử sử dụng mô-đun thực hiện phép tính số thập phân phù hợp cho ứng dụng kế toán và ứng dụng có độ chính xác cao

    Một dạng số học chính xác khác được hỗ trợ bởi mô-đun thực hiện phép tính số học dựa trên các số hữu tỷ (vì vậy các số như 1/3 có thể được biểu diễn chính xác)

    Nếu bạn là người sử dụng nhiều các phép tính dấu phẩy động, bạn nên xem qua gói NumPy và nhiều gói khác dành cho các phép toán và thống kê do dự án SciPy cung cấp. Xem < https. //scipy. tổ chức>

    Python cung cấp các công cụ có thể hữu ích trong những trường hợp hiếm hoi khi bạn thực sự muốn biết giá trị chính xác của số float. Phương thức biểu thị giá trị của số float dưới dạng phân số

    0.33
    
    0

    Vì tỷ lệ này là chính xác nên nó có thể được sử dụng để tạo lại giá trị ban đầu một cách dễ dàng

    0.33
    
    1

    Phương thức này biểu thị một số float ở dạng thập lục phân (cơ số 16), một lần nữa đưa ra giá trị chính xác được máy tính của bạn lưu trữ

    0.33
    
    2

    Biểu diễn thập lục phân chính xác này có thể được sử dụng để tái tạo lại chính xác giá trị float

    0.33
    
    3

    Vì biểu diễn là chính xác nên rất hữu ích để chuyển các giá trị một cách đáng tin cậy qua các phiên bản khác nhau của Python (độc lập với nền tảng) và trao đổi dữ liệu với các ngôn ngữ khác hỗ trợ cùng định dạng (chẳng hạn như Java và C99)

    Một công cụ hữu ích khác là chức năng giúp giảm thiểu tình trạng mất độ chính xác trong quá trình tính tổng. Nó theo dõi "các chữ số bị mất" khi các giá trị được thêm vào tổng số đang chạy. Điều đó có thể tạo ra sự khác biệt về độ chính xác tổng thể để các lỗi không tích lũy đến mức chúng ảnh hưởng đến tổng số cuối cùng

    0.33
    
    4

    15. 1. Lỗi trình bày

    Phần này giải thích “0. 1” một cách chi tiết và cho biết cách bạn có thể tự mình thực hiện phân tích chính xác các trường hợp như thế này. Sự quen thuộc cơ bản với biểu diễn dấu phẩy động nhị phân được giả định

    Lỗi biểu diễn đề cập đến thực tế là một số phân số thập phân (hầu hết, trên thực tế) không thể được biểu diễn chính xác dưới dạng phân số nhị phân (cơ số 2). Đây là lý do chính tại sao Python (hoặc Perl, C, C++, Java, Fortran, và nhiều thứ khác) thường không hiển thị số thập phân chính xác mà bạn mong đợi

    Tại sao vậy? . Hầu như tất cả các máy hiện nay (tháng 11 năm 2000) đều sử dụng số học dấu phẩy động IEEE-754 và hầu hết tất cả các nền tảng ánh xạ Python đều có độ chính xác kép IEEE-754. 754 nhân đôi chứa 53 bit chính xác, do đó, trên đầu vào, máy tính sẽ cố gắng chuyển đổi 0. 1 thành phân số gần nhất mà nó có thể có dạng J/2**N trong đó J là một số nguyên chứa chính xác 53 bit. viết lại

    0.33
    
    5

    như

    0.33
    
    6

    và nhớ lại rằng J có chính xác 53 bit (là

    >>> 0.1
    0.1000000000000000055511151231257827021181583404541015625
    
    6 nhưng là
    >>> 0.1
    0.1000000000000000055511151231257827021181583404541015625
    
    7), giá trị tốt nhất cho N là 56

    0.33
    
    7

    Tức là, 56 là giá trị duy nhất của N để lại cho J đúng 53 bit. Giá trị tốt nhất có thể của J khi đó thương số đó được làm tròn

    0.33
    
    8

    Vì số dư lớn hơn một nửa của 10, nên giá trị gần đúng nhất có được bằng cách làm tròn lên

    0.33
    
    9

    Do đó, xấp xỉ tốt nhất có thể đến 1/10 trong độ chính xác kép 754 là

    0.333
    
    0

    Chia cả tử và mẫu cho 2 sẽ được phân số

    0.333
    
    1

    Lưu ý rằng vì chúng ta đã làm tròn số nên con số này thực sự lớn hơn 1/10 một chút; . Nhưng không có trường hợp nào có thể chính xác 1/10

    Vì vậy, máy tính không bao giờ “thấy” 1/10. những gì nó nhìn thấy là phân số chính xác được đưa ra ở trên, xấp xỉ kép 754 tốt nhất mà nó có thể nhận được

    0.333
    
    2

    Nếu chúng ta nhân phân số đó với 10**55, chúng ta có thể thấy giá trị ra đến 55 chữ số thập phân

    0.333
    
    3

    nghĩa là số chính xác được lưu trong máy tính bằng giá trị thập phân 0. 1000000000000000055511151231257827021181583404541015625. Thay vì hiển thị giá trị thập phân đầy đủ, nhiều ngôn ngữ (bao gồm cả các phiên bản Python cũ hơn), làm tròn kết quả thành 17 chữ số có nghĩa

    Bạn có thể nhân số float không?

    Trước hết, bạn có thể nhân số float . Vấn đề bạn gặp phải không phải là phép nhân, mà là số ban đầu bạn đã sử dụng. Phép nhân có thể mất một số độ chính xác, nhưng ở đây, số ban đầu bạn đã nhân bắt đầu với độ chính xác bị mất. Đây thực sự là một hành vi dự kiến.

    Làm cách nào để nhân hai số IEEE 754?

    Phép nhân Cách thức hoạt động của phép nhân IEEE 754 giống với cách thức hoạt động của nó đối với ký hiệu khoa học thông thường. Chỉ cần nhân các hệ số và cộng các số mũ . Tuy nhiên, vì điều này được thực hiện trong phần cứng nên chúng tôi có thêm một số ràng buộc, chẳng hạn như tràn và làm tròn, cần tính đến.

    Bạn có thể nhân chuỗi bằng số float trong Python không?

    Không thể nhân chuỗi với số dấu phẩy động . Điều này là do nhân các chuỗi với các số nguyên sẽ tạo ra một chuỗi lặp lại của chuỗi. Điều này là không thể khi sử dụng dấu phẩy động vì nó sẽ dẫn đến việc nhân một chuỗi với các giá trị thập phân.