2012-08-23 34 views
5

Tôi đang phát triển một ứng dụng C++ chạy trên môi trường Linux. Tôi cần phải lưu trữ một giá trị lớn với 6 deciaml nơi. Tôi đã sử dụng gấp đôi cho điều đó. Nhưng sau khi gán, biến kép không chứa giá trị chính xác. Nó đã làm tròn.Mất chính xác với đôi C++

Ex:

double dValue = 79447461534242.913072; //Assignement of value 

Nhưng sau đó, khi tôi nhìn thấy giá trị trong dValue nó là một cái gì đó giống như 79447461534242,906

một ai có thể cho tôi biết tại sao điều này xảy ra và đề nghị tôi đúng kiểu dữ liệu có thể giữ giá trị chính xác với việc mất độ chính xác.

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –

+0

Đừng quên chấp nhận câu trả lời yêu thích của bạn;) –

Trả lời

5

Trong triển khai điển hình, double có khoảng 15 chữ số chính xác tổng số. Nó không quan trọng nhiều cho dù đó là trước hoặc sau dấu thập phân, nó chỉ là tổng cộng 15 chữ số.

Trong trường hợp của bạn, số gốc là khoảng 20 chữ số, vì vậy năm số bị mất ngay lập tức.

+0

Bạn có chắc chắn về độ chính xác 15 chữ số trong tổng * *? Ít nhất trong độ chính xác số nguyên Javascript là chính xác ... Nhưng tôi không chắc liệu đây có phải là điều duy nhất cho Javascript hay không. –

+1

@MarcusRiemer: Các kiểu số nguyên cũng chính xác trong C++; nhưng câu hỏi này là về các loại dấu phẩy động. –

+0

@MarcusRiemer: 'double' và số nguyên là hai loại động vật hoàn toàn khác nhau. Trong khi các ngôn ngữ "cấp cao hơn" thường hỗ trợ các số nguyên chính xác tùy ý, C++ thường được thực hiện với phần cứng cung cấp - thường là 16 bit cho ngắn, 32 cho int, 32 hoặc 64 bit cho dài và 64 cho dài. 'double' thường là kiểu dấu phẩy động 64-bit với mantissa 53 bit. –

5

C++ sử dụng các loại điểm nổi IEEE chỉ chính xác ở một mức độ nhất định theo thiết kế. Nếu bạn cần độ chính xác đơn phương, hãy xem ví dụ GNU MP Bignum hoặc bất kỳ thư viện chính xác khác.

2

most commonly used double precision format lưu trữ số có 53 bit chính xác. Điều này cung cấp cho khoảng 16 chữ số thập phân chính xác.

Bạn có thể thấy rằng long double cho độ chính xác cao hơn, nhưng không đảm bảo rằng số đó lớn hơn double.

Nếu bạn cần độ chính xác cao hơn mức bạn có thể nhận được từ các loại máy gốc, bạn sẽ cần thư viện số có độ chính xác cao, chẳng hạn như GMP.

1

Trên Linux, bạn có thể sử dụng __float128 là loại điểm nổi chính xác gấp bốn lần.

+0

Miễn là bạn có gcc> 4.6 –

+0

Tôi không thể biên dịch nó bằng __float28.Lỗi này cho biết lỗi '__float128' không được khai báo trong phạm vi này – user1308004

+0

Bạn đang sử dụng phiên bản gcc nào? Nhập 'gcc --version' –

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