2011-12-19 25 views
19

Được coi là "kiểu xấu" để sử dụng toán tử tăng (++) trên phao không? Nó biên dịch tốt nhưng tôi thấy nó có mùi và phản trực giác.Có sử dụng số gia tăng (toán tử ++) trên kiểu nổi không?

Câu hỏi: Trong trường hợp nào đang sử dụng ++ trên biến nổi hợp lý và tốt hơn += 1.0f? Nếu không có trường hợp sử dụng, có một hướng dẫn phong cách C++ đáng kính mà nói rõ ràng rằng ++ trên phao là ác?

Đối với float ++ không tăng theo giá trị nhỏ nhất có thể, nhưng bằng 1,0. 1.0f không có ý nghĩa đặc biệt (không giống như số nguyên 1). Nó có thể gây nhầm lẫn cho người đọc khiến anh ta nghĩ rằng biến đó là int.

Đối với phao không đảm bảo rằng toán tử ++ thay đổi đối số. Ví dụ: vòng lặp sau đây không phải là vô hạn:

float i, j; 
for (i=0.0, j=1.0; i!=j;i=j++); 

Do đó làm ++ ngay sau đó - không đảm bảo rằng giá trị không thay đổi.

+2

Có sự khác biệt lớn giữa j ++ và ++ j – luke

+0

Tại sao bạn không chia đôi câu hỏi trả lời của mình thành câu hỏi phù hợp và câu trả lời đúng? Bạn có thể nhận được nhiều phiếu bầu hơn nếu mọi người đồng ý với bạn. – vitaut

+3

+1 - Tôi đồng ý rằng '+ +' có nghĩa là "tiến tới giá trị tiếp theo", chứ không phải "tăng số ma thuật 1".Và theo nghĩa đó, nó không có ý nghĩa gì khi sử dụng với phao nổi. Tuy nhiên, tôi nghi ngờ sẽ có một câu trả lời thỏa mãn cho câu hỏi này. – tenfour

Trả lời

12

Nói chung ++/-- không được xác định cho phao, vì không rõ giá trị nào nên được tăng lên. Vì vậy, bạn có thể có may mắn trên một hệ thống trong đó ++ dẫn đến f += 1.0f nhưng có thể có những trường hợp điều này không hợp lệ. Do đó, đối với phao nổi, bạn sẽ phải cung cấp một giá trị cụ thể.

++/-- được định nghĩa là "tăng/giảm 1". Do đó, điều này có thể áp dụng cho các giá trị dấu phẩy động. Tuy nhiên, cá nhân tôi nghĩ rằng, điều này có thể gây nhầm lẫn cho một người không nhận thức được định nghĩa này (hoặc chỉ áp dụng nó cho các số nguyên), vì vậy tôi khuyên bạn nên sử dụng f += 1.0f.

+4

Nó được định nghĩa cho tất cả các loại số học và con trỏ: 'Giá trị của đối tượng toán hạng được sửa đổi bằng cách thêm 1 vào nó, trừ khi đối tượng là kiểu bool, trong trường hợp nó được đặt thành true' – fefe

+0

Ngoài ra gcc không phàn nàn về float ++ khi biên dịch với -Wall. – Muxecoid

+0

@fefe: Cảm ơn bạn đã làm rõ –

15

Khi bạn thêm nhiều 1.0 đến một phao, vì điểm số học nổi bạn có thể có một chút ra vào cuối

Cách tốt nhất là để làm

for (int i = 0; i < 100; i++) 
{ 
    float f = 2.433f + i * 1.0f; 

thay vì

for (float f = 2.433f; f < 102.433f; f += 1.0f) 

Trong trường hợp thứ hai, lỗi số học của dấu phẩy động cộng thêm và trong trường hợp đầu tiên thì không. Như một số người dùng đã chỉ ra trong các ý kiến ​​dưới đây thêm tích phân nổi có thể không tích lũy lỗi nhưng nói chung nó là một ý tưởng tốt để tránh nó.

+4

Có. (Nhưng tại sao nhân với 1.0f? 'Phao f = 2.433f + i;' là đủ.) – TonyK

+2

@TonyK Tôi đã suy nghĩ của một gia tăng chung ... và để tăng được 1.0f ... :) –

+2

Trong khi nó là đúng là các giá trị phân số không có đại diện chính xác như phao, giá trị tích phân luôn luôn làm và kết quả của việc thêm hai phao nổi với các giá trị tích phân (có vẻ như những gì OP đang làm) sẽ không bao giờ có lỗi vòng. – Ferruccio

4

Kiểu xấu. ++-- được thiết kế để đặt giá trị bằng giá trị tiếp theo hoặc trước đó, như số nguyên tiếp theo hoặc trước đó, phần tử tiếp theo hoặc trước đó trong một mảng (cho con trỏ), phần tử tiếp theo hoặc trước đó trong vùng chứa (trình lặp), v.v.

Giá trị tiếp theo và trước đó không được xác định rõ cho các phao. Làm f += 1. một cách rõ ràng.

+2

Tôi không chắc chắn tôi làm theo những gì bạn đang nói. Theo như các toán tử tăng và giảm được "dự định" để làm bất cứ điều gì, chúng có ý định tăng và giảm bất kỳ loại nào chúng được định nghĩa - bao gồm cả các loại dấu phẩy động. Sự khác biệt duy nhất giữa 'f + = 1.' và' ++ f' là giá trị cũ của 'f' tăng gấp đôi cho phép tính. –

+1

@Mike: Tôi nghĩ rằng larsmans và người hỏi đang có hiệu lực khẳng định rằng đó là một sai lầm (kiểu xấu) trong tiêu chuẩn C để định nghĩa '++' cho các loại dấu phẩy động. Họ khẳng định điều này dựa trên nhận thức của họ về mục đích dự định của toán tử đó cho các kiểu khác, và rằng chỉ vì định nghĩa có thể được áp dụng cho bất kỳ kiểu nào với toán tử '+ =' chỉ định '1' trên rh, không có nghĩa là mục đích áp dụng. –

+0

@SteveJessop: Chính xác. Tôi đã có một cuộc tranh luận về chủ đề với đồng nghiệp của tôi vì vậy bây giờ tôi đang tìm kiếm một hướng dẫn phong cách hỗ trợ quan điểm của tôi.:) – Muxecoid

9

Không có gì sai khi sử dụng ++-- trên các toán hạng float hoặc double. Nó chỉ đơn giản là thêm hoặc trừ 1. Đó là những gì nó cho!

+0

Đó là thực sự không đúng sự thật như tôi đang quan tâm, theo 'tiêu chuẩn' mà không thực sự xác định hành vi ở đây, tôi sẽ không dựa vào đó. – ScarletAmaranth

+3

@ScarletAmaranth Tiêu chuẩn này chỉ định hành vi, rất chính xác. (Điều đó không nhất thiết có nghĩa rằng đó là một ý tưởng tốt.) –

+0

@TonyK Lời xin lỗi của tôi, bỏ qua bình luận trước đây của tôi, mặc dù hành vi của nó là không xác định khi giao dịch với phao (xem xét rất nhiều vấn đề giải thích nổi-điểm.) Vì vậy, có, nó chỉ đơn giản là increments bởi một :) – ScarletAmaranth

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