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
.
đọ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. –
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) –
@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