当编译器直接分配给不同类型时,编译器如何处理浮点文字?

时间:2018-02-02 04:38:08

标签: c++ floating-point

最近我们遇到了一些与浮动精度相关的问题。具体做法是:

float values[10];
values[0] = 123.45;
values[1] = 567.89;

或:

float values[10];
values[0] = 123.45f;
values[1] = 567.89f;

或:

float values[10];
values[0] = float(123.45);
values[1] = float(567.89);

以下是问题:

  1. 虽然用XX.XX编写的文字是双格式的,如果直接分配给单个左值,它是否仍然在程序的常量区域中编译成双值?或者它在编译时直接转换为32位单?

  2. XX.XXffloat(XX.XX)有相同的含义吗?或者后一种形式是否实际存储了一个双常数,并在运行时将其转换为单个预定?

1 个答案:

答案 0 :(得分:2)

  

虽然XX.XX中的文字是双格式,但如果是   直接分配给单个左值,它是否仍然编译成一个   程序的常量区域中的双值?或者直接   在编译时转换为32位单?

在编译时将double转换为32位。如何进行转换主要由编译器决定。引用标准:

  

浮点类型的prvalue可以转换为prvalue   另一种浮点类型。如果源值可以准确   在目标类型中表示,转换的结果是   确切的表示。如果源值在两个相邻之间   目标值,转换结果

关于你的观点2,对于常量文字,答案很大程度上取决于传递的值。虽然float(xx.xx)涉及从double转换为float,但xx.xxf已经是浮点类型。