2010-06-15 33 views
5

Tôi đã đọc hầu hết các bài viết trên đây về điểm nổi và tôi hiểu vấn đề cơ bản khi sử dụng IEEE 754 (và chỉ với bản chất lưu trữ số nhị phân). Tôi đang cố gắng tìm ra những điều sau đây: Nếu cả hai Python và JavaScript sử dụng các tiêu chuẩn IEEE 754, tại sao là nó mà thực hiện những điều sau bằng PythonMột câu hỏi nổi khác

.1 + .1

Kết quả trong ,20000000000000001 (mà là để được dự kiến)

trong trường hợp như trong Javascript (trong ít nhất Chrome và Firefox) câu trả lời là 0,2

Tuy nhiên thực hiện

.1 + .2

Trong cả hai ngôn ngữ kết quả trong 0,30000000000000004

Bên cạnh đó, thực hiện var a = 0,3; trong JavaScript và in một kết quả trong 0,3

Trong trường hợp như làm a = 0,3 trong kết quả Python trong 0,29999999999999999

Tôi muốn hiểu được lý do cho sự khác biệt này trong hành vi.

Ngoài ra, nhiều bài đăng trên hệ điều hành liên kết đến một cổng JavaScript của BigDecimal của Java, nhưng liên kết đã chết. Có ai có bản sao không?

Trả lời

6

làm a = 0,3 trong kết quả Python trong 0,29999999999999999

Không hẳn - đồng hồ:

>>> a = 0.3 
>>> print a 
0.3 
>>> a 
0.29999999999999999 

Như bạn thấy, in ing a không hiển thị 0.3 - vì theo mặc định print vòng đến 6 hoặc 7 chữ số thập phân, trong khi nhập một biểu thức (ở đây a là một biến duy nhất biểu thức) tại dấu nhắc hiển thị kết quả với số lượng nhiều hơn hai lần (do đó tiết lộ các giới hạn nội tại của dấu phẩy động).

Javascript có thể có các quy tắc làm tròn hơi khác nhau về cách hiển thị số và chi tiết chính xác của làm tròn đủ để giải thích sự khác biệt mà bạn quan sát. Lưu ý, ví dụ: (trên bảng điều khiển javascript của Chrome):

> (1 + .1) * 1000000000 
    1100000000 
> (1 + .1) * 100000000000000 
    110000000000000.02 

xem? nếu bạn quản lý để xem nhiều chữ số hơn, các bất thường (chắc chắn là cũng là ở đó) cũng sẽ hiển thị.

+0

Như mọi khi, một câu trả lời rõ ràng! –

+0

Cảm ơn! Điều đó giúp làm rõ nó. – jeffmax

+0

Tôi chưa thử, nhưng liên kết mới đến lớp JavaScript BigDecimal là http://stz-ida.de/index.php?option=com_content&view=article&id=18:bigdecimal-unterstuetzung-fuer-javascript&catid=4: phần mềm & Itemid = 32 – jeffmax

0

Tôi muốn hiểu lý do của sự khác biệt này về hành vi.

  1. Chúng là các ngôn ngữ khác nhau.

  2. Chúng sử dụng các gói cơ bản khác nhau.

  3. Chúng có các triển khai khác nhau.

Khi bạn nói "Python" - bạn đang nói về triển khai nào? C, Jython, IronPython? Bạn có so sánh từng cái đó không?

Những người Javascript dường như xử lý các phân số nhị phân lặp lại khác với cách mà các người Python xử lý các phân số nhị phân lặp lại.

Đôi khi Javascript lặng lẽ ngăn chặn các bit lỗi ở cuối. Đôi khi nó không.

Đó là lý do.

Bạn có mã nguồn cho cả hai. Nếu bạn muốn biết nhiều hơn, bạn có thể. Tuy nhiên, việc biết mã nguồn không thay đổi nhiều.

3

và in.

Cả hai có thể có cùng một đại diện cơ bản IEEE 754, nhưng điều đó không có nghĩa là chúng buộc phải in theo cùng một cách.Có vẻ như Javascript đang làm tròn đầu ra khi sự khác biệt đủ nhỏ.

Với số dấu chấm động, phần quan trọng là cách dữ liệu nhị phân được cấu trúc, không phải dữ liệu được hiển thị trên màn hình.