2015-05-27 18 views
8

Từ QUESTION này khác họ nói về cách Bjarne Stroustrup nói rằng cũng giống như không thể thiếu dữ liệu loại hẹp hơn một int (ví dụ short) đều được thăng một int, float s được đề bạt lên một double. Tuy nhiên, không giống như mở rộng các tích phân hẹp hơn so với các quảng cáo int, dấu phẩy động nổi không xảy ra theo cùng một cách, mà thay vào đó, xảy ra ở nơi khác.Không thực sự, khi nào khuyến mãi điểm nổi thực sự xảy ra?

Tôi biết rằng nếu bạn đã tính toán float + double các float sẽ được chuyển đổi sang một double trước khi các nhà điều hành nhị phân (+) được áp dụng. Tuy nhiên, đây không phải là khuyến mãi điểm nổi theo Learncpp.com. Đây là chuyển đổi số học thông thường.

Khi nào khuyến mại điểm nổi thực sự xảy ra?

+1

đọc qua các nhận xét và câu trả lời bạn sẽ thấy sách của Bjarne bị lỗi. –

+0

có thể trùng lặp của [khuyến mại nổi điểm: stroustrup vs trình biên dịch - người nào là đúng?] (Http://stackoverflow.com/questions/17215484/floating-point-promotion-stroustrup-vs-compiler-who-is-right) –

+0

@RichardHodges Tôi đã đọc qua các bình luận. Ngay cả khi đoạn trích nhỏ đó được lấy ra khỏi cuốn sách, điều đó không cho tôi biết nếu quảng bá điểm nổi được lấy ra khỏi ngôn ngữ. Tôi vẫn không có ý tưởng gì khi quảng bá điểm nổi có thể xảy ra. – Bryan

Trả lời

13

Có một điều như "khuyến mại điểm nổi" của float đến double cho mỗi [conv.fpprom].

Giá trị loại float có thể được chuyển đổi thành giá trị loại double. Giá trị không thay đổi.

Chuyển đổi này được gọi là khuyến mãi điểm nổi.

Câu trả lời cho câu hỏi được liên kết là chính xác. Quảng cáo này sẽ không tự động xảy ra khi thêm hai float giây vì chuyển đổi số học thông thường không quảng bá toán hạng dấu phẩy động.

Khuyến mại điểm nổi không xảy ra khi chuyển một toán hạng sang dấu ba chấm, như trong printf.Đó là lý do tại sao mã định dạng số %f in hoặc float hoặc double: nếu bạn vượt qua float, chức năng thực sự nhận được double, kết quả của quảng cáo.

Sự tồn tại của việc thúc đẩy điểm nổi cũng rất quan trọng trong việc giải quyết tình trạng quá tải, bởi vì không thể thiếu chương trình khuyến mãi và điểm nổi chương trình khuyến mãi có rank chuyển đổi ngầm tốt hơn so với không thể thiếu chuyển đổi, điểm nổi chuyển đổi, và dấu chấm động không thể thiếu chuyển đổi.

Ví dụ 1:

void f(double); 
void f(long double); 
f(0.0f); 

này gọi void f(double) từ việc bổ nhiệm vào double là tốt hơn so với việc chuyển đổi sang long double. Ngược lại, hãy xem xét ví dụ có lẽ đáng ngạc nhiên này 2:

void f(long double); 
void f(int); 
f(0.0f); 

Đây là mơ hồ. Chuyển đổi từ float thành long double không tốt hơn chuyển đổi từ float thành int vì cả hai không phải là quảng cáo.

Ví dụ 3:

struct S { 
    operator float(); 
    operator int(); 
}; 
double d = S(); 

này gọi operator float và sau đó thúc đẩy kết quả float giá trị cho double để khởi d.

+0

Câu trả lời của bạn rất chi tiết và có những ví dụ tuyệt vời. Tôi hoàn toàn nhận được khuyến khích điểm nổi bây giờ. Cảm ơn bạn rất nhiều! – Bryan

6

Thời gian chính (có thể là duy nhất) mà quảng cáo điểm nổi được áp dụng là khi chuyển đối số cho hàm variadic (ví dụ: printf).

Trong trường hợp này, chuyển đổi số học thông thường không áp dụng (chúng cho việc tìm kiếm loại phổ biến giữa hai toán hạng trong biểu thức).

Phần liên quan của tiêu chuẩn là [expr.call]/7 (ít nhất là của N4296):

Khi không có tham số cho một cuộc tranh luận nhất định, các đối số được truyền theo cách như vậy rằng hàm nhận có thể lấy giá trị của đối số bằng cách gọi va_arg (18.10).
[...]
Nếu đối số có loại tích phân hoặc liệt kê phải tuân theo các khuyến mãi không thể tách rời (4.5) hoặc loại điểm nổi tuân theo khuyến mại điểm nổi (4.6), giá trị của đối số được chuyển thành loại được quảng cáo trước cuộc gọi.

+0

Bạn đang nói về loại chuyển đổi? Tôi biết rằng loại chuyển đổi xảy ra nếu bạn chuyển một phao sang một hàm variadic có một tham số gấp đôi là tham số của nó. Tôi không tin rằng loại chuyển đổi và khuyến mãi điểm nổi là những điều tương tự. Nếu bạn có ý nghĩa gì khác, bạn sẽ vui lòng xây dựng? – Bryan

+0

Ồ! Bạn đang nói về hình elip. Trường hợp tham số có thể là bất kỳ giá trị nào và bất kỳ số lượng giá trị nào. Vì vậy, đó là nơi khuyến khích điểm nổi có thể xảy ra. Cảm ơn bạn! – Bryan

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