考虑:
double f = foo();
double g = -f;
where foo()
可以返回分配给的任何内容f
.
is double g = -f;
在 C 和 C++ 中安全吗?对于 IEEE 754 类型,显然是这样,但 C 和 C++ 并不限制浮点实现(与 Java 不同)。
如果安全的话会-g
总是比较true
with foo()
?
(以上不适用于int
2 的补码)。
浮动类型由 C 标准(至少 N1570 草案)的 §5.2.4.2.2 定义:
浮点类型的特征是根据模型来定义的,该模型描述浮点数和值的表示形式,提供有关实现的浮点算术的信息。21)以下参数用于定义每个浮点的模型类型:
-
s
符号(±1)
-
b
指数表示的基数或基数(> 1 的整数)
-
e
指数(最小 emin 和最大 emax 之间的整数)
-
p
精度(有效数中以 b 为基数的位数)
-
fk
小于 b(有效数字)的非负整数
浮点数 (x) 由以下模型定义:
所以是的,这个表达式是somewhat safe,除了以下情况foo
返回标准未指定的“其他类型的浮点数”之一:
除了标准化浮点数(如果 x ≠ 0,则 f1 > 0)之外,浮点类型还可以包含其他类型的浮点数,例如次正规浮点数(x ≠ 0,e = emin ,f1 = 0)和非标准化浮点数(x ≠ 0,e > emin,f1 = 0),以及非浮点数的值,例如无穷大和 NaN。
and:
实现可以给零和非浮点数的值(例如无穷大和 NaN)带符号,也可以不带符号。
可能还有其他警告,但该标准详细介绍了这些类型的特征。您可以阅读有关它们的所有内容这个公开的草案 http://www.compsci.hunter.cuny.edu/~sweiss/resources/c11standard.pdf.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)