kir*_*kun 2 c c++ bit-representation inexact-arithmetic
是否可以在具有符合ANSI标准的C编译器的所有环境中使用以下代码?
double n = 0;
assert(n == 0);
Run Code Online (Sandbox Code Playgroud)
那么C++呢?
你不是在问是否0.0总能完全代表.
在语句中assert(n == 0),在比较发生之前0转换为double.因此,如果转换只能触发断言0来自int于double不可再现.这比你问什么弱得多的限制,几乎肯定会举行(虽然我想不出一个标准参考的,以保证它把我的头顶部).
对于您打算提出的问题:
正如其他人所提到的,C标准并不要求浮点类型映射到IEEE-754,但我不知道任何C编译器使用的浮点表示没有精确的零表示.也就是说,对于C实现而言,使用一种格式double并不完全为零是"合法的" .
C标准确实对浮点值的表示方式施加了一些限制.在§5.2.4.2.2浮点类型的特征中,浮点数必须表现出类似于模型定义的特征:
X = SB ë Σ K = 1..p ˚F ķ b -k
哪里:
在这个模型下,零总是能够精确表示 - 它只需要所有有效数字f k为零.
鉴于§6.3.1.4中的以下限制:
当整数类型的值转换为实际浮动类型时,如果正在转换的值可以在新类型中准确表示,则它将保持不变.
因此,当从整数0转换为浮点类型时,零必须始终保持不变.因此断言必须始终坚持.