问题描述
|
可以期望以下代码在具有ANSI兼容C编译器的所有环境中工作吗?
double n = 0;
assert(n == 0);
C ++呢?
解决方法
您不是在问
0.0
是否总是准确表示。
在语句“ 2”中,在进行比较之前,“ 3”被转换为“ 4”。因此,只有在无法将“ 3”从“ 6”转换为“ 4”的情况下,才能触发断言。这是一个比您要问的要弱得多的限制,并且几乎可以肯定会成立(尽管我无法想到一个标准参考来保证它是我的首要任务)。
对于您要提出的问题:
就像其他人提到的那样,C标准不要求浮点类型映射到IEEE-754,但是我不知道与任何不具有精确表示形式的C编译器一起使用的任何浮点表示形式。就是说,对于C实现,使用不带完全零的ѭ4格式是“合法的”。
,C标准确实对如何表示浮点值设置了一些限制。在第5.2.4.2.2节“浮点类型的特性”中,浮点数必须表现出特性,就像它们是由模型定义的一样:
x = sbeΣk= 1..p fk b-k
哪里:
s是符号,必须为±1;
b是基数,并且必须是大于1的整数;
e是指数,必须是emin和emax之间的整数;
p是精度;和
fk是非负整数