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.
concat21*'0'
concat1
”这样的字符串应该在double
和long double
中四舍五入到1
。无论如何,我会说“那么相等比较可能会得到0(false)。”