2010-09-12 38 views
9

Tôi có một số câu hỏi về cách đặt f bên cạnh giá trị theo nghĩa đen. Tôi biết nó định nghĩa nó như là một float nhưng tôi thực sự cần nó? Đây có phải là 2.0f * 2.0f bất kỳ nhanh hơn hoặc được biên dịch nào khác với 2.0 * 2.0 không? Tuyên bố có giống như float a = 2.0; được biên dịch khác với float a = 2.0f; không?Sự khác biệt giữa 2.0 và 2.0f (dấu phẩy rõ ràng so với hai chữ số)

+3

Bạn có nghĩa là "giá trị chữ", không phải "tên biến". '2.0' là giá trị' double'. '2.0f' là một giá trị' float'. '2' là giá trị' int'. Không có biến nào trong số này là các biến. – RBerteig

+0

@RBerteig xấu của tôi :) –

+0

xin lỗi, không có nghĩa là âm thanh như tôi đã ranting có ... Tôi có lẽ nên có chỉ cần chỉnh sửa cơ thể âm thầm. – RBerteig

Trả lời

19

Đôi khi bạn cần nó để có rõ ràng loại float, như trong trường hợp sau đây

float f = ...; 
float r = std::max(f, 42.0); // won't work; (float, double). 
float r = std::max(f, 42.0f); // works: both have same type 
6

Tôi hiếm khi về tốc độ (ít nhất là trực tiếp), nhưng thực tế là nếu không trình biên dịch sẽ cảnh báo về việc chuyển đổi double thành float.

+0

Ok nhưng trên một ví dụ * 2.0 là thực sự sử dụng nhân đôi? –

+2

Về lý thuyết, tôi tin rằng sẽ dẫn đến nhân hai 'double', chuyển đổi kết quả thành' float'. Trong thực tế, với nó là 2.0, rất có thể là trình biên dịch có thể/sẽ tìm ra rằng nó có thể sử dụng 'float' trong suốt. OTOH, có những giới hạn bắt buộc về tối ưu hóa toán học FP (đặc biệt là trong C99), do đó, làm cho nó rõ ràng có thể giúp đỡ. –

+0

vâng tôi chỉ sử dụng 2.0 làm ví dụ. Cảm ơn đã giúp đỡ. –

3

AFAIK, trên máy tính "bình thường" (x86 với x87 -like coprocessor toán học) sự khác biệt về tốc độ là không thích hợp, vì các tính toán được thực hiện trong nội bộ ở độ chính xác 80 bit. Nổi có thể đạt được tầm quan trọng khi bạn có số lượng lớn các số dấu phẩy động để quản lý (các tính toán khoa học hoặc các thứ tương tự), do đó, có kiểu dữ liệu nhỏ hơn có thể thuận tiện, cả hai đều sử dụng ít bộ nhớ hơn và đọc nhanh hơn chúng từ RAM/đĩa. Cũng có thể hữu ích khi sử dụng phao thay vì tăng gấp đôi trên các máy thiếu đơn vị dấu chấm động (ví dụ: hầu hết các vi điều khiển), trong đó tất cả số học dấu phẩy động được thực hiện bằng phần mềm bằng mã được trình biên dịch chèn vào; trong trường hợp này, có thể đạt được tốc độ hoạt động trên phao nổi (và trong môi trường như vậy thường cũng có mọi vấn đề bộ nhớ). Trên PC, IMO bạn chỉ có thể sử dụng gấp đôi trong các ngữ cảnh "bình thường", chỉ cần tránh trộn các kiểu dữ liệu (double, float, ints, ...) trong cùng biểu thức để tránh các chuyển đổi tốn kém không cần thiết. Nhưng dù sao, với các bản văn, trình biên dịch phải đủ thông minh để thực hiện chuyển đổi tại thời gian biên dịch.

+0

Đúng, tôi đang sử dụng iphone. –

+0

Vì những gì tôi đã đọc, bộ xử lý iPhone là ARM1176 với FPU tùy chọn được cung cấp (xem tại đây: http://www.arm.com/products/processors/technologies/vector-floating-point.php); Tôi không có chuyên gia về nó, nhưng tôi không nghĩ rằng tốc độ thay đổi rất nhiều với nổi/tăng gấp đôi trong trường hợp này. Mối quan tâm duy nhất của tôi là nó có "16 độ chính xác gấp đôi hoặc 32 thanh ghi chính xác duy nhất", vì vậy chỉ sử dụng phao bạn có thể nhận được thứ gì đó từ thanh ghi bổ sung, nhưng nó cũng phụ thuộc vào cách môi trường được thiết lập. –

+0

Vâng tôi biết bạn có thể nhưng trên iphone đôi chắc chắn là chậm hơn sau đó trôi nổi. –

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