Hướng dẫn python check if float between two values - python kiểm tra nếu float giữa hai giá trị

Làm cách nào để kiểm tra xem X có giữa A và B không?

a = 9
b = 7
x = 7.5

Tôi đã nghĩ ra điều này:

a < x < b or b < x < a

Nó dường như thực hiện công việc từ một vài bài kiểm tra tôi đã thực hiện, nhưng nó trông không thể đọc được và khó hiểu. Bất kỳ cách tốt hơn khác?

Đã hỏi ngày 7 tháng 5 năm 2019 lúc 14:39May 7, 2019 at 14:39

Multigoodversemultigoodversemultigoodverse

7.02816 Huy hiệu vàng61 Huy hiệu bạc100 Huy hiệu đồng16 gold badges61 silver badges100 bronze badges

6

Điều gì về việc sử dụng:

min[a, b] < x < max[a, b]

Đã trả lời ngày 7 tháng 5 năm 2019 lúc 14:51May 7, 2019 at 14:51

nghĩ ra bốn điều này:

min[a, b] < x < max[a, b]

a < x < b if a < b else b < x < a

[a - x] * [b - x] < 0

not [b < x > a and a < x > b]

Nhưng vẫn nghĩ rằng phiên bản của bạn là tốt nhất.

Đã trả lời ngày 7 tháng 5 năm 2019 lúc 14:52May 7, 2019 at 14:52

Recnacrecnacrecnac

3.6836 huy hiệu vàng22 Huy hiệu bạc46 Huy hiệu đồng6 gold badges22 silver badges46 bronze badges

13

Tôi nghĩ rằng đây có thể là những gì bạn cần. Câu trả lời khác của tôi là vô nghĩa và tôi đã viết nó quá nhanh.

def is_between[a, x, b]:
    return min[a, b] < x < max[a, b]

Có tính đến A và B không bao giờ là không. Chúng phải là cả hai số hợp lệ

Đã trả lời ngày 7 tháng 5 năm 2019 lúc 14:52May 7, 2019 at 14:52

Recnacrecnacmadtyn

3.6836 huy hiệu vàng22 Huy hiệu bạc46 Huy hiệu đồng24 silver badges53 bronze badges

3

Số điểm nổi là một cách nhanh chóng và hiệu quả để lưu trữ và làm việc với các số, nhưng chúng đi kèm với một loạt các cạm bẫy chắc chắn đã khiến nhiều lập trình viên non trẻ phải trải qua-có lẽ một số lập trình viên có kinh nghiệm cũng vậy! Ví dụ kinh điển chứng minh những cạm bẫy của phao diễn ra như thế này:

>>> 0.1 + 0.2 == 0.3
False

Nhìn thấy điều này lần đầu tiên có thể mất phương hướng. Nhưng đừng ném máy tính của bạn vào thùng rác. Hành vi này là chính xác!

Bài viết này sẽ cho bạn thấy lý do tại sao các lỗi điểm nổi như ở trên là phổ biến, tại sao chúng có ý nghĩa và những gì bạn có thể làm để đối phó với chúng trong Python.

Máy tính của bạn là một kẻ nói dối [loại]

Bạn đã thấy rằng

min[a, b] < x < max[a, b]
5 không bằng
min[a, b] < x < max[a, b]
6 nhưng sự điên rồ không dừng lại ở đó. Dưới đây là một số ví dụ gây nhiễu hơn:

>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False

Vấn đề cũng không bị hạn chế trong so sánh bình đẳng,:

>>> 0.1 + 0.2 >> 10.4 + 20.8 > 31.2
True

>>> 0.8 - 0.1 > 0.7
True

Vì vậy những gì đang xảy ra? Máy tính của bạn có nói dối bạn không? Nó chắc chắn trông giống như nó, nhưng có nhiều thứ đang diễn ra bên dưới bề mặt.

Khi bạn nhập số

min[a, b] < x < max[a, b]
7 vào trình thông dịch Python, nó sẽ được lưu trữ trong bộ nhớ dưới dạng số điểm nổi. Có một chuyển đổi diễn ra khi điều này xảy ra.
min[a, b] < x < max[a, b]
7 là số thập phân trong cơ sở 10, nhưng số điểm nổi được lưu trữ trong nhị phân. Nói cách khác,
min[a, b] < x < max[a, b]
7 được chuyển đổi từ cơ sở 10 thành cơ sở 2.

Số nhị phân kết quả có thể không đại diện chính xác số cơ sở ban đầu 10.

min[a, b] < x < max[a, b]
7 là một ví dụ. Biểu diễn nhị phân là \ [0,0 \ Overline {0011} \]. Nghĩa là,
min[a, b] < x < max[a, b]
7 là một số thập phân lặp lại vô hạn khi được viết bằng cơ sở 2. Điều tương tự xảy ra khi bạn viết phân số ⅓ như một số thập phân trong cơ sở 10. bạn kết thúc với số thập phân lặp lại vô hạn \ [0. \ Overline {33} \ ].

Bộ nhớ máy tính là hữu hạn, do đó, biểu diễn phân số nhị phân lặp lại vô hạn của

min[a, b] < x < max[a, b]
7 được làm tròn thành một phần hữu hạn. Giá trị của số này phụ thuộc vào kiến ​​trúc của máy tính của bạn [32 bit so với 64 bit]. Một cách để xem giá trị điểm nổi được lưu trữ cho
min[a, b] < x < max[a, b]
7 là sử dụng phương thức
min[a, b] < x < max[a, b]

a < x < b if a < b else b < x < a

[a - x] * [b - x] < 0

not [b < x > a and a < x > b]
4 cho phao để lấy tử số và mẫu số của biểu diễn điểm nổi:

>>> numerator, denominator = [0.1].as_integer_ratio[]
>>> f"0.1 ≈ {numerator} / {denominator}"
'0.1 ≈ 3602879701896397 / 36028797018963968'

Bây giờ sử dụng

min[a, b] < x < max[a, b]

a < x < b if a < b else b < x < a

[a - x] * [b - x] < 0

not [b < x > a and a < x > b]
5 để hiển thị phân số chính xác đến 55 số thập phân:

>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'

Vì vậy,

min[a, b] < x < max[a, b]
7 được làm tròn đến một số lớn hơn một chút so với giá trị thực của nó.

Lỗi này, được gọi là lỗi biểu diễn điểm nổi, xảy ra thường xuyên hơn bạn có thể nhận ra.floating-point representation error, happens way more often than you might realize.

Muốn nhiều hơn như thế này?

Một email, mỗi thứ bảy, với một mẹo hành động. Luôn luôn dưới 5 phút thời gian của bạn.
Always less than 5 minutes of your time.

Lỗi đại diện thực sự phổ biến

Có ba lý do mà một số được làm tròn khi được biểu diễn dưới dạng số điểm nổi:

  1. Số lượng có nhiều chữ số quan trọng hơn các điểm nổi cho phép.
  2. Số lượng là phi lý.
  3. Số lượng là hợp lý nhưng có biểu diễn nhị phân không kết thúc.

Số điểm nổi 64 bit là tốt cho khoảng 16 hoặc 17 chữ số quan trọng. Bất kỳ số có chữ số quan trọng hơn được làm tròn. Các số phi lý, như π và E, không thể được biểu diễn bằng bất kỳ phân số chấm dứt nào trong bất kỳ cơ sở số nguyên nào. Vì vậy, một lần nữa, không có vấn đề gì, những con số phi lý sẽ được làm tròn khi được lưu trữ dưới dạng phao.

Hai tình huống này tạo ra một bộ số vô hạn không thể được biểu diễn chính xác dưới dạng số điểm nổi. Nhưng trừ khi bạn là một nhà hóa học đối phó với những con số nhỏ, hoặc một nhà vật lý liên quan đến số lượng lớn về mặt thiên văn, bạn không có khả năng gặp phải những vấn đề này.

Thế còn việc không kết thúc số hợp lý, như

min[a, b] < x < max[a, b]
7 trong cơ sở 2? Đây là nơi bạn sẽ gặp phải hầu hết các tai ương dấu nổi của mình và nhờ vào toán học xác định liệu một phân số có chấm dứt hay không, bạn sẽ chống lại lỗi đại diện thường xuyên hơn bạn nghĩ.

Trong cơ sở 10, một phân số chấm dứt nếu mẫu số của nó là một sản phẩm có sức mạnh của các yếu tố chính là 10. Hai yếu tố chính của 10 là 2 và 5, do đó các phân số như ½, ¼, ⅕, và ⅒ tất cả chấm dứt, nhưng ⅓ , ⅐, và không. Tuy nhiên, trong cơ sở 2, chỉ có một yếu tố chính: 2. Vì vậy, chỉ có các phân số có mẫu số là sức mạnh của 2 chấm dứt. Kết quả là, các phân số như ⅓, ⅕, ⅙, ⅐, và ⅒ đều không kết thúc khi được biểu thị bằng nhị phân.terminates if its denominator is a product of powers of prime factors of 10. The two prime factors of 10 are 2 and 5, so fractions like ½, ¼, ⅕, ⅛, and ⅒ all terminate, but ⅓, ⅐, and ⅑ do not. In base 2, however, there is only one prime factor: 2. So only fractions whose denominator is a power of 2 terminate. As a result, fractions like ⅓, ⅕, ⅙, ⅐, ⅑, and ⅒ are all non-terminating when expressed in binary.

Bây giờ bạn có thể hiểu ví dụ ban đầu trong bài viết này.

min[a, b] < x < max[a, b]
7,
min[a, b] < x < max[a, b]

a < x < b if a < b else b < x < a

[a - x] * [b - x] < 0

not [b < x > a and a < x > b]
9 và
min[a, b] < x < max[a, b]
6 đều được làm tròn khi chuyển đổi thành số điểm nổi:

a < x < b or b < x < a
0

Khi

min[a, b] < x < max[a, b]
7 và
min[a, b] < x < max[a, b]

a < x < b if a < b else b < x < a

[a - x] * [b - x] < 0

not [b < x > a and a < x > b]
9 được thêm vào, kết quả là một số lớn hơn một chút so với
min[a, b] < x < max[a, b]
6:

a < x < b or b < x < a
1

min[a, b] < x < max[a, b]
5 lớn hơn một chút so với ____26 và
min[a, b] < x < max[a, b]
6 được biểu thị bằng một số nhỏ hơn một chút so với chính nó, biểu thức
def is_between[a, x, b]:
    return min[a, b] < x < max[a, b]
7 đánh giá là
def is_between[a, x, b]:
    return min[a, b] < x < max[a, b]
8.

Lỗi biểu diễn điểm nổi là điều mà mọi lập trình viên trong mọi ngôn ngữ cần phải nhận thức và biết cách xử lý. Nó không cụ thể cho Python. Bạn có thể thấy kết quả của việc in

min[a, b] < x < max[a, b]
5 bằng nhiều ngôn ngữ khác nhau tại trang web có tên khéo léo của Erik Wiffin 0.300000000000004.com.It's not specific to Python. You can see the result of printing
min[a, b] < x < max[a, b]
5 in many different languages over at Erik Wiffin's aptly named website 0.30000000000000004.com.

Vì vậy, làm thế nào để bạn đối phó với các lỗi biểu diễn dấu phẩy động khi so sánh phao trong Python? Bí quyết là tránh kiểm tra sự bình đẳng. Không bao giờ sử dụng

>>> 0.1 + 0.2 == 0.3
False
0,
>>> 0.1 + 0.2 == 0.3
False
1 hoặc
>>> 0.1 + 0.2 == 0.3
False
2 với phao. Thay vào đó, hãy sử dụng chức năng
>>> 0.1 + 0.2 == 0.3
False
3:

a < x < b or b < x < a
2

>>> 0.1 + 0.2 == 0.3
False
3 Kiểm tra xem đối số đầu tiên có thể chấp nhận gần với đối số thứ hai không. Nhưng chính xác thì điều đó có nghĩa là gì? Ý tưởng chính là kiểm tra khoảng cách giữa đối số thứ nhất và đối số thứ hai, tương đương với giá trị tuyệt đối của sự khác biệt của các giá trị:distance between the first argument and the second argument, which is equivalent to the absolute value of the difference of the values:

a < x < b or b < x < a
3

Nếu

>>> 0.1 + 0.2 == 0.3
False
5 nhỏ hơn một số tỷ lệ phần trăm của
>>> 0.1 + 0.2 == 0.3
False
6 hoặc
>>> 0.1 + 0.2 == 0.3
False
7 lớn hơn, thì
>>> 0.1 + 0.2 == 0.3
False
6 được coi là đủ gần với
>>> 0.1 + 0.2 == 0.3
False
7 để "bằng" với
>>> 0.1 + 0.2 == 0.3
False
7. Tỷ lệ này được gọi là dung sai tương đối. Bạn có thể chỉ định dung sai tương đối với đối số từ khóa
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
1 của
>>> 0.1 + 0.2 == 0.3
False
3 mặc định là
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
3. Nói cách khác, nếu
>>> 0.1 + 0.2 == 0.3
False
5 nhỏ hơn
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
5, thì
>>> 0.1 + 0.2 == 0.3
False
6 và
>>> 0.1 + 0.2 == 0.3
False
7 được coi là "đóng" với nhau. Điều này đảm bảo rằng
>>> 0.1 + 0.2 == 0.3
False
6 và
>>> 0.1 + 0.2 == 0.3
False
7 bằng khoảng chín vị trí thập phân.relative tolerance. You can specify the relative tolerance with the
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
1 keyword argument of
>>> 0.1 + 0.2 == 0.3
False
3 which defaults to
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
3. In other words, if
>>> 0.1 + 0.2 == 0.3
False
5 is less than
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
5, then
>>> 0.1 + 0.2 == 0.3
False
6 and
>>> 0.1 + 0.2 == 0.3
False
7 are considered "close" to each other. This guarantees that
>>> 0.1 + 0.2 == 0.3
False
6 and
>>> 0.1 + 0.2 == 0.3
False
7 are equal to about nine decimal places.

Bạn có thể thay đổi dung sai tương đối nếu bạn cần:

a < x < b or b < x < a
4

Tất nhiên, dung sai tương đối phụ thuộc vào các ràng buộc được đặt ra bởi vấn đề bạn đang giải quyết. Tuy nhiên, đối với hầu hết các ứng dụng hàng ngày, dung sai tương đối mặc định là đủ.

Có một vấn đề nếu một trong số

>>> 0.1 + 0.2 == 0.3
False
6 hoặc
>>> 0.1 + 0.2 == 0.3
False
7 bằng không và
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
1 là ít hơn một. Trong trường hợp đó, cho dù giá trị khác không đến mức nào về 0, dung sai tương đối đảm bảo rằng việc kiểm tra sự gần gũi sẽ luôn thất bại. Trong trường hợp này, sử dụng dung sai tuyệt đối hoạt động như một dự phòng:

a < x < b or b < x < a
5

>>> 0.1 + 0.2 == 0.3
False
3 sẽ tự động kiểm tra này cho bạn. Đối số từ khóa
>>> 0.1 + 0.2 >> 10.4 + 20.8 > 31.2
True

>>> 0.8 - 0.1 > 0.7
True
4 xác định dung sai tuyệt đối. Tuy nhiên,
>>> 0.1 + 0.2 >> 10.4 + 20.8 > 31.2
True

>>> 0.8 - 0.1 > 0.7
True
4 mặc định là
>>> 0.1 + 0.2 >> 10.4 + 20.8 > 31.2
True

>>> 0.8 - 0.1 > 0.7
True
6 vì bạn sẽ cần đặt thủ công này nếu bạn cần kiểm tra mức độ gần với giá trị với 0.

Tất cả trong tất cả,

>>> 0.1 + 0.2 == 0.3
False
3 trả về kết quả của so sánh sau, kết hợp các thử nghiệm tương đối và tuyệt đối thành một biểu thức duy nhất:

a < x < b or b < x < a
6

>>> 0.1 + 0.2 == 0.3
False
3 đã được giới thiệu trong PEP 485 và đã có sẵn kể từ Python 3.5.

Hãy vượt qua "bướu trung gian."

Một email, mỗi thứ bảy, để thách thức các kỹ năng của bạn và truyền cảm hứng cho sự tò mò. Luôn luôn dưới 5 phút thời gian của bạn.

Khi nào bạn nên sử dụng
>>> 0.1 + 0.2 == 0.3
False
3?

Nói chung, bạn nên sử dụng

>>> 0.1 + 0.2 == 0.3
False
3 bất cứ khi nào bạn cần so sánh các giá trị dấu phẩy động. Thay thế
>>> 0.1 + 0.2 == 0.3
False
0 bằng
>>> 0.1 + 0.2 == 0.3
False
3:

a < x < b or b < x < a
7

Bạn cũng cần phải cẩn thận với so sánh

>>> 0.1 + 0.2 == 0.3
False
1 và
>>> 0.1 + 0.2 == 0.3
False
2. Xử lý sự bình đẳng riêng biệt bằng cách sử dụng
>>> 0.1 + 0.2 == 0.3
False
3 và sau đó kiểm tra so sánh nghiêm ngặt:

a < x < b or b < x < a
8

Các lựa chọn thay thế khác nhau cho

>>> 0.1 + 0.2 == 0.3
False
3 tồn tại. Nếu bạn sử dụng Numpy, bạn có thể tận dụng
>>> numerator, denominator = [0.1].as_integer_ratio[]
>>> f"0.1 ≈ {numerator} / {denominator}"
'0.1 ≈ 3602879701896397 / 36028797018963968'
7 và
>>> numerator, denominator = [0.1].as_integer_ratio[]
>>> f"0.1 ≈ {numerator} / {denominator}"
'0.1 ≈ 3602879701896397 / 36028797018963968'
8:

a < x < b or b < x < a
9

Hãy nhớ rằng dung sai tương đối và tuyệt đối mặc định không giống như

>>> 0.1 + 0.2 == 0.3
False
3. Dung sai tương đối mặc định cho cả
>>> numerator, denominator = [0.1].as_integer_ratio[]
>>> f"0.1 ≈ {numerator} / {denominator}"
'0.1 ≈ 3602879701896397 / 36028797018963968'
7 và
>>> numerator, denominator = [0.1].as_integer_ratio[]
>>> f"0.1 ≈ {numerator} / {denominator}"
'0.1 ≈ 3602879701896397 / 36028797018963968'
8 là
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
2 và dung sai tuyệt đối mặc định cho cả hai là
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
3.

>>> 0.1 + 0.2 == 0.3
False
3 đặc biệt hữu ích cho các bài kiểm tra đơn vị, mặc dù có một số lựa chọn thay thế. Mô-đun
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
5 tích hợp của Python có phương pháp
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
6. Tuy nhiên, phương pháp đó chỉ sử dụng một bài kiểm tra khác biệt tuyệt đối. Đó cũng là một khẳng định, có nghĩa là những thất bại làm tăng
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
7, khiến nó không phù hợp để so sánh trong logic kinh doanh của bạn.

Một giải pháp thay thế tuyệt vời cho

>>> 0.1 + 0.2 == 0.3
False
3 để kiểm tra đơn vị là hàm
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9 từ gói
a < x < b or b < x < a
00. Không giống như
>>> 0.1 + 0.2 == 0.3
False
3,
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9 chỉ lấy một đối số - cụ thể là giá trị bạn mong đợi:

min[a, b] < x < max[a, b]
0

>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9 có các đối số từ khóa
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
1 và
>>> 0.1 + 0.2 >> 10.4 + 20.8 > 31.2
True

>>> 0.8 - 0.1 > 0.7
True
4 để thiết lập dung sai tương đối và tuyệt đối. Các giá trị mặc định khác với
>>> 0.1 + 0.2 == 0.3
False
3, tuy nhiên.
>>> 0.2 + 0.2 + 0.2 == 0.6
False

>>> 1.3 + 2.0 == 3.3
False

>>> 1.2 + 2.4 + 3.6 == 7.2
False
1 có giá trị mặc định là
a < x < b or b < x < a
08 và
>>> 0.1 + 0.2 >> 10.4 + 20.8 > 31.2
True

>>> 0.8 - 0.1 > 0.7
True
4 có giá trị mặc định là
a < x < b or b < x < a
10.

Nếu đối số được chuyển đến

>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9 giống như mảng, có nghĩa là đó là một con trăn có thể giống như một danh sách hoặc một tuple, hoặc thậm chí là một mảng numpy, thì
>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9 hoạt động tương tự như
>>> numerator, denominator = [0.1].as_integer_ratio[]
>>> f"0.1 ≈ {numerator} / {denominator}"
'0.1 ≈ 3602879701896397 / 36028797018963968'
7 và trả về liệu hai mảng có bằng nhau trong phạm vi dung sai:

min[a, b] < x < max[a, b]
1

>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9 thậm chí sẽ hoạt động với các giá trị từ điển:

min[a, b] < x < max[a, b]
2

Số điểm nổi là tuyệt vời để làm việc với các số bất cứ khi nào không cần độ chính xác tuyệt đối. Chúng nhanh chóng và hiệu quả bộ nhớ. Nhưng nếu bạn cần độ chính xác, thì có một số lựa chọn thay thế cho phao mà bạn nên xem xét.

Các lựa chọn thay thế điểm nổi chính xác

Có hai loại số tích hợp trong Python cung cấp độ chính xác đầy đủ cho các tình huống mà phao không đủ:

a < x < b or b < x < a
15 và
a < x < b or b < x < a
16.

Loại
a < x < b or b < x < a
15

Loại

a < x < b or b < x < a
15 có thể lưu trữ các giá trị thập phân chính xác với độ chính xác nhiều như bạn cần. Theo mặc định,
a < x < b or b < x < a
15 bảo tồn 28 số liệu quan trọng, nhưng bạn có thể thay đổi điều này thành bất cứ điều gì bạn cần để phù hợp với vấn đề cụ thể mà bạn đang giải quyết:

min[a, b] < x < max[a, b]
3

Bạn có thể đọc thêm về loại

a < x < b or b < x < a
15 trong tài liệu Python.

Loại
a < x < b or b < x < a
16

Một cách khác cho các số điểm nổi là loại

a < x < b or b < x < a
16.
a < x < b or b < x < a
16 có thể lưu trữ các số hợp lý chính xác và khắc phục các vấn đề lỗi đại diện gặp phải bởi các số điểm nổi:

min[a, b] < x < max[a, b]
4

Cả

a < x < b or b < x < a
16 và
a < x < b or b < x < a
15 đều cung cấp nhiều lợi ích so với các giá trị điểm nổi tiêu chuẩn. Tuy nhiên, những lợi ích này có giá: giảm tốc độ và mức tiêu thụ bộ nhớ cao hơn. Nếu bạn không cần độ chính xác tuyệt đối, tốt hơn hết là bạn nên gắn bó với phao. Nhưng đối với những thứ như các ứng dụng tài chính và nhiệm vụ quan trọng, sự đánh đổi phát sinh bởi
a < x < b or b < x < a
16 và
a < x < b or b < x < a
15 có thể đáng giá.

Sự kết luận

Giá trị dấu phẩy động là cả một phước lành vừa là một lời nguyền. Họ cung cấp các hoạt động số học nhanh và sử dụng bộ nhớ hiệu quả với chi phí đại diện không chính xác. Trong bài viết này, bạn đã học được:

  • Tại sao các số điểm nổi là không chính xác
  • Tại sao lỗi biểu diễn điểm nổi là phổ biến
  • Cách so sánh chính xác các giá trị điểm nổi trong Python
  • Cách & nbsp; biểu thị các số chính xác bằng cách sử dụng các loại
    a < x < b or b < x < a
    
    16 và
    a < x < b or b < x < a
    
    15 của Python

Nếu bạn đã học được điều gì đó mới, thì thậm chí có thể có nhiều hơn mà bạn không biết về các con số trong Python. Ví dụ: bạn có biết loại

a < x < b or b < x < a
30 không phải là loại số nguyên duy nhất trong Python không? Tìm hiểu loại số nguyên khác là gì và các sự kiện ít được biết đến khác về các con số trong bài viết 3 của tôi những điều bạn có thể không biết về các con số trong Python.

3 điều bạn có thể không biết về các con số trong Python

Nếu bạn đã viết bất cứ điều gì bằng Python, bạn có thể đã sử dụng một số trong một trong các chương trình của mình. Nhưng có nhiều con số hơn là chỉ có giá trị thô của chúng.

David Amos

Tài nguyên bổ sung

  • Số học nổi: Các vấn đề và giới hạn
  • Hướng dẫn nổi
  • Những nguy hiểm của điểm nổi
  • Toán học nổi
  • Những gì mọi nhà khoa học máy tính nên biết về số học nổi
  • Cách làm tròn số trong Python

Cảm ơn Brian Okken đã giúp bắt gặp một vấn đề với một trong các ví dụ

>>> format[numerator / denominator, ".55f"]
'0.1000000000000000055511151231257827021181583404541015625'
9.

Chúng ta có thể sử dụng == để so sánh hai giá trị nổi trong Python không?

Sự khôn ngoan phổ biến rằng các số điểm nổi không thể được so sánh với sự bình đẳng là không chính xác. Các số điểm nổi không khác với số nguyên: nếu bạn đánh giá "A == B", bạn sẽ trở thành đúng nếu chúng là số giống hệt nhau và sai [với sự hiểu biết rằng hai NAN tất nhiên không phải là số giống hệt nhau].floating-point numbers cannot be compared for equality is inaccurate. Floating-point numbers are no different from integers: If you evaluate "a == b", you will get true if they are identical numbers and false otherwise [with the understanding that two NaNs are of course not identical numbers].

Làm thế nào để bạn so sánh hai giá trị float trong Python?

Làm thế nào để so sánh phao trong Python.Nếu ABS [A - B] nhỏ hơn một số tỷ lệ phần trăm của A hoặc B lớn hơn, thì A được coi là đủ gần với B là "bằng" với B.Tỷ lệ này được gọi là dung sai tương đối.Bạn có thể chỉ định dung sai tương đối với đối số từ khóa REL_TOL của toán học.If abs[a - b] is smaller than some percentage of the larger of a or b , then a is considered sufficiently close to b to be "equal" to b . This percentage is called the relative tolerance. You can specify the relative tolerance with the rel_tol keyword argument of math.

Làm thế nào để bạn kiểm tra xem một số float có nằm trong phạm vi trong Python không?

Cách dễ nhất là trước tiên chuyển đổi số thập phân thành chuỗi và chia bằng '.'và kiểm tra xem độ dài của ký tự. Nếu nó> 2 sau đó chuyển qua.tức là chuyển đổi số đầu vào sử dụng để kiểm tra xem nó có nằm trong một phạm vi nhất định không.convert the decimal to string and split with '. ' and check if the length of the character. If it is >2 then pass on. i.e. Convert use input number to check if it is in a given range.

Làm thế nào để bạn kiểm tra xem một số là giữa hai giá trị trong Python?

Làm thế nào để bạn kiểm tra xem một số là giữa 2 số trong Python?Sử dụng các toán tử so sánh để kiểm tra xem một số là giữa hai số.Sử dụng mức tối thiểu cú phápUse the comparison operators to check if a number is between two numbers. Use the syntax minimum

Bài Viết Liên Quan

Chủ Đề