5

Khi tôi gỡ lỗi phần mềm của tôi trong VS C++ bằng cách bước mã tôi nhận thấy rằng một số tính toán phao hiển thị như một số với một dấu chấm, ví dụ:Dấu chấm ở cuối phao có cho thấy thiếu chính xác không?

1232432. 

Một hoạt động dẫn đến kết quả này này:

float result = pow(10, a * 0.1f)/b 

trong đó một số âm lớn khoảng -50 đến -100 và b thường là khoảng 1. Tôi đọc một số bài viết về sự cố với độ chính xác khi nói đến dấu phẩy động. Câu hỏi của tôi chỉ là dấu chấm là một cách Visual-Studio cho tôi biết rằng độ chính xác rất thấp trên con số này, tức là trong kết quả biến. Nếu không, nó có nghĩa là gì?

Điều này xuất hiện tại nơi làm việc hôm nay và tôi nhớ rằng có vấn đề với số lượng lớn hơn nên điều này xảy ra mỗi lần (và "điều này" tôi có nghĩa là dấu chấm). Nhưng tôi nhớ rằng nó đã xảy ra khi có bảy chữ số trong số đó. Ở đây họ wright rằng độ chính xác của nổi bảy chữ số:

C++ Float Division and Precision

này có thể là điều và Visual Studio nói với tôi điều này bằng cách đặt một dấu chấm cuối cùng?

TÔI NGHINK TÔI NÓ NÓ! Nó nói "Phần định trị được chỉ định như một chuỗi các chữ số theo sau một dấu chấm". Mantissa nghĩa là gì? Điều này có thể khác trên PC và khi chạy mã trên DSP không? Bởi vì vấn đề là tôi nhận được kết quả khác nhau và điều duy nhất có vẻ kỳ lạ đối với tôi là điều thời kỳ này, vì tôi không biết nó có ý nghĩa gì.

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=vs.71).aspx

+1

FYI '1.' và' .1' là literals đôi hợp lệ trong C++ (ít nhất là gcc) – Joe

+0

tôi nhận được rằng .1 là một float/double hợp lệ nhưng tại sao nó không in cùng một dấu. cho mỗi phao? Nếu một đôi là số không nó in 0,0000000 nhưng không bao giờ 0. chỉ. Tại sao nó dấu chấm chỉ một vài lần, nó phải là một cái gì đó đặc biệt xảy ra đối với một số lượng lớn. –

+0

@ThomasJohansson: Bạn sẽ cần phải thực hiện điều đó với nhóm VS tôi giả sử. Vấn đề là nó hoàn toàn không có gì để làm với độ chính xác của phao. Ở đây, bạn nên biết [công cụ này] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –

Trả lời

3

Nếu bạn đề cập đến quy ước "sig figs" trong đó "4.0" có nghĩa là 4 & plusmn; 0.1 và "4.00" có nghĩa là 4 & plusmn; , không có khái niệm như vậy trong float hoặc double. Các số luôn được lưu trữ với 24 hoặc 53 bit quan trọng (7.22 hoặc 15.95 chữ số thập phân) bất kể số lượng thực sự là "đáng kể".

Dấu chấm chỉ là dấu thập phân mà không có bất kỳ chữ số nào sau dấu chấm (đó là chữ C hợp pháp). Nó hoặc là có nghĩa là

  • Giá trị là 1232432.0 và họ trimed sự không cần thiết trailing zero, HOẶC
  • Tất cả mọi thứ đã được làm tròn đến 7 chữ số có nghĩa (trong trường hợp giá trị thực cũng có thể là 1.232.431,5, 1.232.431,625, 1.232.431,75, 1232431.875, 1232432.125, 1.232.432,25, 1.232.432,375, hoặc 1.232.432,5.)

Các thực câu hỏi là, tại sao bạn đang sử dụng float? double là loại dấu phẩy động "bình thường" trong C (++) và float tối ưu hóa bộ nhớ tiết kiệm.

* pedants sẽ nhanh chóng chỉ ra denormals, các giá trị trung gian x87 80-bit vv

+0

Cảm ơn! Tôi đã tìm thấy vấn đề ban đầu và quản lý để giải quyết điều này nhưng đây là một lời giải thích tốt! –

+0

Tnx! Tôi thấy dấu chấm ở đây, nếu tôi không nhầm, được sử dụng như một cơ chế đúc cho int: int i = 10. * sqrt (n) –

3

Độ chính xác là không thay đổi, mà chỉ đơn giản là như thế nào VS được định dạng nó để trưng bày. Độ chính xác (hoặc thiếu) luôn luôn là hằng số cho một số dấu phẩy động đã cho.

+6

Mặc dù dấu chấm có thể là gợi ý rằng số đó là số dấu phẩy động chứ không phải số nguyên. – Brian

+0

@Brian: Tôi nghĩ đó là lý do tại sao nó ở đó, chỉ như vậy sẽ xảy ra để có tất cả 0 sau thập phân. –

+0

Bởi vì nó không in một dấu chấm ở phần cuối của bất kỳ dấu phẩy động nào và nó không in nó vào cùng một dấu phẩy động mỗi lần nên nó phải là một cái gì đó đặc biệt xảy ra ở một điểm nào đó. Đối với một phép tính, tôi đã cố tính giá trị bằng máy tính Windows và nó khác ... –

1

MSDN page bạn liên kết với các cuộc đàm phán về cú pháp của một dấu phẩy động trong mã nguồn. Nó không xác định làm thế nào số lượng sẽ được hiển thị bởi bất cứ công cụ bạn đang sử dụng. Nếu bạn in một số dấu phẩy động bằng cách sử dụng printf hoặc std:cout << ..., tiêu chuẩn ngôn ngữ sẽ chỉ định cách nó sẽ được in.

Nếu bạn in nó trong trình gỡ rối (có vẻ như bạn đang làm), nó sẽ được định dạng theo bất kỳ cách nào mà các nhà phát triển trình gỡ lỗi đã quyết định.

Có một số cách khác nhau mà một số dấu chấm động nhất định có thể được hiển thị: 1.0, 1., 10.0E-001, và .1e+1 tất cả có nghĩa là chính xác những điều tương tự. Đường nhỏ . thường không cho bạn biết bất kỳ điều gì về độ chính xác. Tôi đoán là các nhà phát triển của trình gỡ rối chỉ sử dụng 1232432. thay vì 1232432.0 để tiết kiệm dung lượng.

Nếu bạn nhìn thấy dấu sau . đối với một số giá trị và số thập phân không có số . cho người khác, có vẻ như trục trặc kỳ lạ (có thể là lỗi) trong trình gỡ lỗi.

Nếu bạn đang băn khoăn về độ chính xác thực tế là, đối với IEEE 32-bit float (định dạng hầu hết các máy tính sử dụng những ngày này), những con số biểu diễn tiếp theo trước và sau khi 1232432.01232431.8751232432.125.(Bạn sẽ nhận được độ chính xác tốt hơn nhiều bằng cách sử dụng double thay vì float.)

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