涉及文字比较安全吗?

问题描述 投票:0回答:1

考虑代码:

#define LITERAL 1.0

int main()
{
    double x = LITERAL;

    if (x == LITERAL) return 1;
    else return 0;
}

对于我们设置为1的任何数字双精度值(是否不仅是LITERAL还是任何其他双精度字面值,是否都保证会返回1.0

c++ c floating-point precision literals
1个回答
0
投票

首先,您必须假定(试图)符合附件F的实现,因为否则所有选择都会被取消;没有附件F(IEEE浮点数)C的情况下,所有浮点结果都可以是伪造的。

然后,根据语言规范,取决于您的C实现对FLT_EVAL_METHOD的定义,是还是否。>

如果值为0或1,则为是。文字被解释为doubledouble对象忠实地存储该值,并且相等运算符产生1(真),以反映这一点。

如果值为2,则仅当文字是可表示的double的精确十进制表示形式时。否则(例如,如果类似0.1之类的话),则文字会以[long double格式的excess precision

进行解释,并且对double对象的初始化/赋值会将精度截断为标称double精确。然后保证相等比较得出0(false)。

为了使事情更复杂,除非您使用-std=c..-fexcess-precision=standard,并且总是做错了],否则GCC会执行默认情况下错了

,而在C ++模式下,clang / LLVM总是做错了。因此,在精度过高的目标(32位x86或m68k,只有与FLT_EVAL_METHOD不为0或1的与现实世界相关的目标)上,会发生可怕的事情。要了解它们的严重程度,请参阅GCC issue 93806和(递归)所有与“另请参阅”相关的问题。

因此,出于实际目的,是的,对于除32位x86和m68k之外的所有内容,以及在正确的C实现中,对于它们而言,都不是(但可能是这样,因为您的编译器可能已损坏)。

© www.soinside.com 2019 - 2024. All rights reserved.