Python mũ float

Vì bộ nhớ máy tính bị hạn chế nên bạn không thể lưu trữ các số với độ chính xác vô hạn, bất kể bạn sử dụng phân số nhị phân hay số thập phân. tại một số điểm bạn phải cắt bỏ. Nhưng cần bao nhiêu độ chính xác?

  • Đối với một kỹ sư xây dựng đường cao tốc, không quan trọng là 10 mét hay 10. rộng 0001 mét - số đo của chúng có thể không chính xác ngay từ đầu
  • Đối với ai đó đang thiết kế một vi mạch, 0. 0001 mét [một phần mười milimét] là một sự khác biệt rất lớn - Nhưng chúng sẽ không bao giờ phải xử lý khoảng cách lớn hơn 0. 1 mét
  • Một nhà vật lý cần sử dụng tốc độ ánh sáng [khoảng 300000000] và hằng số hấp dẫn Newton [khoảng 0. 0000000000667] với nhau trong cùng một phép tính

Để làm hài lòng kỹ sư và nhà thiết kế chip, định dạng số phải cung cấp độ chính xác cho các số ở các cường độ rất khác nhau. Tuy nhiên chỉ cần độ chính xác tương đối. Để làm hài lòng nhà vật lý, phải có khả năng thực hiện các phép tính liên quan đến các số có độ lớn khác nhau

Về cơ bản, việc có một số cố định các chữ số nguyên và phân số là không hữu ích - và giải pháp là định dạng có dấu phẩy động

Số dấu phẩy động hoạt động như thế nào

Ý tưởng được soạn một số hai phần chính

  • Một dấu hiệu có chứa các chữ số của số. Ý nghĩa âm đại diện cho số âm
  • Một số mũ cho biết vị trí của dấu thập phân [hoặc nhị phân] được đặt so với phần đầu của dấu và. Số mũ âm biểu thị các số rất nhỏ [i. e. gần bằng không]

Một định dạng như vậy đáp ứng tất cả các yêu cầu

  • Nó có thể biểu thị các số ở các cường độ cực kỳ khác nhau [giới hạn bởi độ dài của số mũ]
  • Nó cung cấp độ chính xác tương đối như nhau ở mọi cường độ [giới hạn bởi độ dài của ý nghĩa]
  • Nó cho phép tính toán trên các cường độ. nhân một số rất lớn và một số rất nhỏ sẽ bảo toàn độ chính xác của cả hai trong kết quả

Số dấu phẩy động thập phân thường có dạng ký hiệu khoa học với dấu rõ ràng luôn nằm giữa chữ số thứ 1 và thứ 2. Số mũ hoặc được viết rõ ràng bao gồm cả cơ số hoặc e được sử dụng để tách nó khỏi ý nghĩa và

Ý nghĩa và số mũKý hiệu khoa họcGiá trị điểm cố định1. 541. 5 ⋅ 10415000-2. 0012-2. 001 ⋅ 102-200. 15-35 ⋅ 10-30. 0056. 667-116. 667e-110. 00000000006667

Tiêu chuẩn

Gần như tất cả các ngôn ngữ lập trình và phần cứng đều sử dụng số dấu phẩy động trong cùng định dạng nhị phân, được định nghĩa trong tiêu chuẩn IEEE 754. Các định dạng thông thường có tổng chiều dài là 32 hoặc 64 bit

Định dạng Tổng số bit Ý nghĩa và bit Số mũ bit Số nhỏ nhất Số lớn nhất Độ chính xác đơn 3223 + 1 ký8ca. 1. 2 ⋅ 10-38ca. 3. 4 ⋅ 1038Double precision6452 + 1 sign11ca. 2. 2 ⋅ 10-308ca. 1. 8 ⋅ 10308

Lưu ý rằng có một số đặc thù

  • Chuỗi bit thực tế đầu tiên là bit dấu, tiếp theo là số mũ và cuối cùng là bit có nghĩa
  • Số mũ không có dấu; . Điều này và chuỗi bit, cho phép so sánh và sắp xếp các số có dấu phẩy động một cách chính xác ngay cả khi diễn giải chúng dưới dạng số nguyên
  • Chữ số có nghĩa nhất của dấu hiệu bị bỏ qua và được giả định là 1, ngoại trừ các số không bình thường được đánh dấu bằng số mũ bằng 0 và cho phép phạm vi số vượt quá các số nhỏ nhất được đưa ra trong bảng trên, với chi phí chính xác
  • Có các giá trị 0 dương và âm riêng biệt, khác nhau ở bit dấu, trong đó tất cả các bit khác là 0. Chúng phải được coi là bằng nhau mặc dù các mẫu bit của chúng khác nhau
  • Có các giá trị vô cực dương và âm đặc biệt, trong đó số mũ là tất cả các bit 1 và ý nghĩa là tất cả các bit 0. Đây là kết quả của các phép tính khi phạm vi dương của số mũ bị vượt quá hoặc phép chia của một số bình thường cho 0
  • Có các giá trị đặc biệt không phải là một số [hoặc NaN] trong đó số mũ là tất cả các bit 1 và ý nghĩa không phải là tất cả các bit 0. Chúng đại diện cho kết quả của các phép tính không xác định khác nhau [như nhân 0 và vô cực, bất kỳ phép tính nào liên quan đến giá trị NaN hoặc các trường hợp dành riêng cho ứng dụng]. Ngay cả các giá trị NaN giống hệt nhau cũng không được coi là bằng nhau

Nếu điều này có vẻ quá trừu tượng và bạn muốn xem một số giá trị cụ thể trông như thế nào trong IEE 754, hãy thử Float Toy hoặc IEEE 754 Visualization hoặc Float Exposed

In the gettype[] manual, it says "[for historical reasons "double" is returned in case of a float, and not simply "float"] ".

However, I think that internally PHP sometimes uses the C double definition [i.e. a double is twice the size of a float/real]. See the example below:

//Function required to reverse a string on blocks of two
function strrev_x[$s, $x = 2] {
    if [$x
[The strrev_x-bin2hex combination is just to give printable characters.]

Given that PHP treats doubles and floats identically, I'd expected the same string as output, however, the output is:

double pack
string[16] "3ff999999999999a" //Here you see that there is a minute difference...
string[16] "3ff9999999999998"
float pack
string[8] "3fcccccd" //.. which doesn't exist here
string[8] "3fcccccd"

So, as an alternative to using
  $float1 === $float2
one could use
  pack['f', $float1] === pack ['f', $float2]
with a big footnote that one should really remember that one is *reducing* your accuracy of the comparison. AFAIK is this the only way [apart from epsilon methods] to securely compare two floats.

Chủ Đề