最近我们遇到了一些与浮动精度相关的问题。具体做法是:
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);
以下是问题:
虽然用XX.XX
编写的文字是双格式的,如果直接分配给单个左值,它是否仍然在程序的常量区域中编译成双值?或者它在编译时直接转换为32位单?
XX.XXf
和float(XX.XX)
有相同的含义吗?或者后一种形式是否实际存储了一个双常数,并在运行时将其转换为单个预定?
答案 0 :(得分:2)
虽然XX.XX中的文字是双格式,但如果是 直接分配给单个左值,它是否仍然编译成一个 程序的常量区域中的双值?或者直接 在编译时转换为32位单?
在编译时将double转换为32位。如何进行转换主要由编译器决定。引用标准:
浮点类型的prvalue可以转换为prvalue 另一种浮点类型。如果源值可以准确 在目标类型中表示,转换的结果是 确切的表示。如果源值在两个相邻之间 目标值,转换结果
关于你的观点2,对于常量文字,答案很大程度上取决于传递的值。虽然float(xx.xx)
涉及从double转换为float,但xx.xxf
已经是浮点类型。