否定浮点数总是安全的
考虑:
double f = foo(); double g = -f;
其中foo()
可以返回分配给f
任何内容。
是double g = -f;
在C和C ++中安全吗? 对于IEEE 754类型,显然是C和C ++不限制浮点实现(与Java不同)。
如果它是安全的,那么-g
总是会与foo()
进行比较吗?
(以上对于2的补码中的int
不是这样)。
浮动类型由C标准的§5.2.4.2.2(至少为N1570草案)定义:
浮点类型的特征是根据描述浮点数的表示的模型和提供有关实现的浮点算法的信息的值来定义的.21)以下参数用于定义每个浮点的模型类型:
s
标志(±1)b
指数表示的基数或基数(整数> 1)e
指数(最小emin和最大emax之间的整数)p
precision(有效数中的base-b数字)fk
非负整数小于b(有效数字)浮点数(x)由以下模型定义:
所以,是的,该表达式有点 安全 ,除非foo
返回标准未指定的“其他种类的浮点数”之一:
除了归一化的浮点数(f1> 0,如果x≠0),浮点类型可能包含其他种类的浮点数,例如次正规浮点数(x≠0,e = emin) ,f1 = 0)和非标准化浮点数(x≠0,e> emin,f1 = 0),以及不是浮点数的值,例如无穷大和NaN。
和:
实现可以给零和不是浮点数(例如无穷大和NaN)的值作为符号或者可以使它们无符号。
可能还有其他注意事项,但标准中有关于这些类型的特征的详细信息。 您可以在此公开草案中阅读有关它们的所有信息。