2010-08-11 41 views
44

Tôi biết rằng kích thước của các loại dữ liệu khác nhau có thể thay đổi tùy thuộc vào hệ thống mà tôi đang sử dụng. Tôi sử dụng XP 32bits và sử dụng toán tử sizeof() trong C++, có vẻ như dài gấp đôi là 12 byte và đôi là 8.dài gấp đôi so với đôi

Tuy nhiên, hầu hết các nguồn chính đều cho biết dài gấp đôi là 8 byte và phạm vi do đó giống như một đôi.

Làm cách nào để có 12 byte? Nếu dài gấp đôi thực sự là 12 byte, điều này không mở rộng phạm vi của giá trị cũng? Hoặc chữ ký dài chỉ được sử dụng (các số liệu biên dịch) khi giá trị vượt quá phạm vi của một đôi, và do đó, mở rộng vượt quá 8 byte?

Cảm ơn bạn.

+2

Đây là tính năng tồi tệ nhất trong ISO C. Tôi mạnh mẽ không khuyến khích bạn sử dụng nó. Nó chỉ dẫn đến các vấn đề bởi vì đặc điểm kỹ thuật quá lỏng lẻo. – Jeff

Trả lời

49

Trích dẫn từ Wikipedia:

Trên kiến ​​trúc x86, hầu hết các trình biên dịch thực hiện từ lâu gấp đôi so với 80-bit mở rộng loại chính xác được hỗ trợ bởi phần cứng (đôi khi được lưu trữ như 12 hoặc 16 byte để duy trì cấu trúc dữ liệu

.

Trình biên dịch cũng có thể sử dụng dài gấp đôi cho một 128-bit định dạng chính xác bốn, mà hiện nay là được thực hiện trong phần mềm.

Nói cách khác, vâng, một long doublethể có thể lưu trữ một loạt lớn các giá trị hơn một double. Nhưng nó hoàn toàn tùy thuộc vào trình biên dịch.

+2

Loại dữ liệu phụ thuộc rất nhiều vào kiến ​​trúc bạn đang phát triển. – karlphillip

+0

Nó cũng phụ thuộc vào tùy chọn trình biên dịch. Loại 80 bit có thể được tắt một cách rõ ràng trên hầu hết mọi trình biên dịch x86. – greyfade

+1

@karlphillip, @greyfade: Có, tôi chỉ có nghĩa là "tối đa trình biên dịch" theo nghĩa là nó quyết định cách lưu trữ dữ liệu của bạn. Rõ ràng nó được giới hạn trong những gì có sẵn trên nền tảng này, và dĩ nhiên trình biên dịch có thể chọn cho phép ghi đè người dùng. – Borealid

2

Kích thước byte chuẩn cho các số là kích thước tối thiểu được đảm bảo trên tất cả các nền tảng. Chúng có thể lớn hơn trên một số hệ thống, nhưng chúng sẽ không bao giờ nhỏ hơn.

1

Theo như kinh nghiệm lập trình newbie nhắc nhở:

  • Sử dụng phao periodicaly bình thường [-1.0, + 1.0]

  • Giữ giá trị bình thường hóa riêng biệt với đôi, hoặc long double

  • Chuẩn hóa giới thiệu tiếng ồn = lỗi nhỏ = tần số cao tới giá trị biến

  • Có những lúc nó rất hữu ích để bình thường hóa với giá trị trung bình giữ riêng biệt và giữ cho dữ liệu được sắp xếp (theo thứ tự dữ liệu gốc có thể được lưu vector như hoán vị)

1

Đối với các trình biên dịch hiện đại trên x64, Clang và sử dụng GCC 16 byte đôi cho long double trong khi VC++ sử dụng 8 byte đôi. Nói cách khác, với Clang và GCC bạn có được độ chính xác cao hơn gấp đôi nhưng đối với VC++ long double giống như double. Các CPU x86 hiện đại hỗ trợ các cặp đôi 16 byte này vì vậy tôi nghĩ Clang và GCC đang làm điều đúng và cho phép bạn truy cập vào khả năng phần cứng mức thấp hơn bằng cách sử dụng các ngôn ngữ cấp cao hơn.

Các vấn đề liên quan