C++ 涉及文本的比较安全吗?

C++ 涉及文本的比较安全吗?,c++,c,floating-point,precision,literals,C++,C,Floating Point,Precision,Literals,以代码为例: #define LITERAL 1.0 int main() { double x = LITERAL; if (x == LITERAL) return 1; else return 0; } 对于我们设置的任何双精度数值LITERAL(不仅仅是1.0,还有任何其他双精度数值),是否保证返回1 编辑:为什么问题因为“缺少细节”而结束?这是一个定义良好的C/C++问题,得到了很好的答案。不需要更多的细节,这是一个关于这些语言如何工作的一般性问题。首先,

以代码为例:

#define LITERAL 1.0

int main()
{
    double x = LITERAL;

    if (x == LITERAL) return 1;
    else return 0;
}
对于我们设置的任何双精度数值
LITERAL
(不仅仅是
1.0
,还有任何其他双精度数值),是否保证返回
1


编辑:为什么问题因为“缺少细节”而结束?这是一个定义良好的C/C++问题,得到了很好的答案。不需要更多的细节,这是一个关于这些语言如何工作的一般性问题。

首先,您必须假设一个(试图)符合附录F的实现,因为否则所有的赌注都是无效的;如果没有附录F(IEEE浮点),C允许所有浮点结果任意伪造

然后,根据语言规范,根据C实现对
FLT\u EVAL\u方法的定义,选择是或否

如果该值为0或1,则为“是”。文本被解释为
double
,而
double
对象忠实地存储该值,等式运算符产生1(true),反映了这一点

如果值为2,则仅当文字是可表示的
double
的eact十进制表示,或表示的精度足以使其不同于仅超过
long double
精度的文字。否则(例如,如果它类似于
0.1
),因为在
long double
格式中,文字的解释精度过高,因此对
double
对象的初始化/赋值会将精度截断为标称
double
精度。然后保证相等比较结果为0(false)。您可以(注意:删除
volatile
,您可以看到它经过优化以返回常量0)

<> >为了使事情更复杂,GCC在默认情况下<强>错误>除非使用“<代码> -STD= C../COD>或 fFultEdvest=标准和<强>总是在C++模式中出错,CLAN/LLVM总是出错。因此,对于精度过高的目标(32位x86或m68k,现实世界中唯一与
FLT_EVAL_方法
not 0或1)会发生可怕的事情。要了解它们有多糟糕,请参阅和(递归地)所有与“请参阅”相关的问题


P> >对于实际的目的,是的,对于32位x86和M68 k,在一个正确的C实现中(不可能,因为编译器可能是坏的)。< /P>选择C或C++。你的问题只涉及<代码>双< /> >还是仅仅是一个例子,你想回答<代码>浮点< /C>吗?@ ErICTrimiSHILL我对两种语言都有兴趣(如果在这个特定的情况下有不同的地方),这就是为什么我有意添加到标签的原因。如果你使用C++,一般不应该使用“y*”定义,更喜欢<代码> const浮点文字=1;
一般来说,不应使用浮点值进行比较。我不认为以下情况是正确的:“那么相等比较将保证结果为0(false)。”如果文本在
double
中不可精确表示,在
long double
中也不可执行表示,最接近的
long double
也可以精确表示为
double
,然后比较返回
1
,与您的说法相反。是否真的可以用
long double
格式解释文本
0.1
?我认为只有当我们使用
L
后缀时才会出现这种情况?@user3137490:如果
FLT\u EVAL\u METHOD
为2,不仅可以用
long double
精度解释;一定是这样。@EOF:我想你可能是对的,但如果没有很多小数位,在实践中是不会出现这种情况的。你有没有更精确的措辞建议?@R..githubstopphelpingice我认为这是完全可行的
long double
通常有大约21位十进制数字的精度,因此像“
1.
concat
21*'0'
concat
1
”这样的字符串应该在
double
long double
中四舍五入到
1
。无论如何,我会说“那么相等比较可能会得到0(false)。”