我认为直接在没有类型转换的情况下执行 afloat和 a之间的比较的代码会被破坏;double即使语言规范说float将被隐式转换,也有两种不同的方式可以明智地执行比较,并且两种方式都不足以真正证明“静默”默认行为是合理的(即编译时不产生警告的方式) . 如果想通过将两个操作数都评估为 来执行转换double,我建议添加显式类型转换以明确意图。但是,在大多数情况下,除了测试特定double->float转换是否可逆而不损失精度之外,我怀疑float值之间的比较可能更合适。
从根本上说,在比较浮点值X和Y任何类型时,应该将比较视为表明X或Y更大,或者数字是“无法区分的”。X应进行显示较大的比较,以表明应表示的数字Y可能小于X或接近X。一个说数字无法区分的比较就是这个意思。如果以这种方式看待事物,则通过强制转换执行的比较float可能不像使用 进行的比较那样“信息丰富” double,但不太可能产生完全错误的结果。相比之下,考虑:
double x, y;
float f = x;
如果比较fand y,可能感兴趣的是如何y与xrounded to a float的值进行比较,但更可能的是,人们真正想知道的是,如果知道 的舍入值x,是否可以说什么关于x和之间的关系y。如果x是 0.1 和y0.2,f就会有足够的信息来说明是否x大于y;如果y是 0.100000001,则不会。在后一种情况下,如果两个操作数都强制转换为 double,则比较将错误地暗示x更大;如果它们都被转换为浮动,则比较会将它们报告为无法区分。请注意,将两个操作数转换为时的比较结果double可能是错误的,不仅当值在百万分之一以内时;它们可能相差数百个数量级,例如 x=1e40 和 y=1e300。比较f和yas float,它们会比较难以区分;比较它们,double较小的值会错误地比较大。